/ Hex Artifact Content
Login

Artifact ee59fef31673d5124413c5a801cfd9ef3e6766d3:


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 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 65 64 2c 20 61 6c 6c 20 74 68 61  occured, all tha
3090: 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20  t remains is to 
30a0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
30b0: 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20  rnal to.**      
30c0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
30d0: 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  action. If an er
30e0: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ror did occur, t
30f0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e  he caller will n
3100: 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72  eed.**      to r
3110: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
3120: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
3130: 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20   ERROR:.**.**   
3140: 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
3150: 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e   is entered when
3160: 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66   an IO or disk-f
3170: 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75  ull error (inclu
3180: 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54  ding.**    SQLIT
3190: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f  E_IOERR_NOMEM) o
31a0: 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74  ccurs at a point
31b0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61   in the code tha
31c0: 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20  t makes it .**  
31d0: 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62    difficult to b
31e0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
31f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
3200: 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e  state (cache con
3210: 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62  tents, .**    db
3220: 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20   size etc.) are 
3230: 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
3240: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3250: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
3260: 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72  .**.**    Tempor
3270: 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 20  ary pager files 
3280: 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45 52  may enter the ER
3290: 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 69  ROR state, but i
32a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a  n-memory pagers.
32b0: 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a  **    cannot..**
32c0: 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  .**    For examp
32d0: 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72  le, if an IO err
32e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
32f0: 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c  performing a rol
3300: 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68  lback, .**    th
3310: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3320: 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79  e page-cache may
3330: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
3340: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74  nconsistent stat
3350: 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73  e..**    At this
3360: 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
3370: 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20  be dangerous to 
3380: 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52  change back to R
3390: 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20  EADER state.**  
33a0: 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61    (as usually ha
33b0: 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f  ppens after a ro
33c0: 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62  llback). Any sub
33d0: 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73 20  sequent readers 
33e0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f  might.**    repo
33f0: 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  rt database corr
3400: 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74  uption (due to t
3410: 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  he inconsistent 
3420: 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a  cache), and if.*
3430: 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61 64  *    they upgrad
3440: 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68  e to writers, th
3450: 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65  ey may inadverte
3460: 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  ntly corrupt the
3470: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
3480: 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74  file. To avoid t
3490: 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20  his hazard, the 
34a0: 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20 69  pager switches i
34b0: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
34c0: 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61  ate.**    instea
34d0: 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c  d of READER foll
34e0: 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72  owing such an er
34f0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e  ror..**.**    On
3500: 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72 65  ce it has entere
3510: 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
3520: 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  e, any attempt t
3530: 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72 0a  o use the pager.
3540: 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72  **    to read or
3550: 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74 75   write data retu
3560: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76  rns an error. Ev
3570: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61  entually, once a
3580: 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61  ll .**    outsta
3590: 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  nding transactio
35a0: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62 61  ns have been aba
35b0: 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65  ndoned, the page
35c0: 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  r is able to.** 
35d0: 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61     transition ba
35e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
35f0: 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68 65  , discarding the
3600: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3610: 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63   .**    page-cac
3620: 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  he and any other
3630: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65   in-memory state
3640: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3650: 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a  e. Everything.**
3660: 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20      is reloaded 
3670: 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20  from disk (and, 
3680: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f  if necessary, ho
3690: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
36a0: 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20  ck peformed).** 
36b0: 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74     when a read-t
36c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
36d0: 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  xt opened on the
36e0: 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74 69   pager (transiti
36f0: 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20  oning.**    the 
3700: 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45  pager into READE
3710: 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68 61  R state). At tha
3720: 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74  t point the syst
3730: 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65 64  em has recovered
3740: 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65   .**    from the
3750: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   error..**.**   
3760: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
3770: 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69  he pager jumps i
3780: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
3790: 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ate if:.**.**   
37a0: 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f     1. An error o
37b0: 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74 65  ccurs while atte
37c0: 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  mpting a rollbac
37d0: 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  k. This happens 
37e0: 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75  in.**         fu
37f0: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3800: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a  gerRollback()..*
3810: 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20  *.**      2. An 
3820: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
3830: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
3840: 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72   finalize a jour
3850: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
3860: 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20      following a 
3870: 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69  commit in functi
3880: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  on sqlite3PagerC
3890: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e  ommitPhaseTwo().
38a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41  .**.**      3. A
38b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
38c0: 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20  hile attempting 
38d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
38e0: 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20  journal or.**   
38f0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
3900: 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ile in function 
3910: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
3920: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
3930: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d  p.**         mem
3940: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e  ory..**.**    In
3950: 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74 68   other cases, th
3960: 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  e error is retur
3970: 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65  ned to the b-tre
3980: 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74  e layer. The b-t
3990: 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20  ree.**    layer 
39a0: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20  then attempts a 
39b0: 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
39c0: 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
39d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20   condition .**  
39e0: 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65 20    persists, the 
39f0: 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
3a00: 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69 61   ERROR state via
3a10: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61   condition (1) a
3a20: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43  bove..**.**    C
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20  ondition (3) is 
3a40: 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
3a50: 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69 67  e it can be trig
3a60: 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64 2d  gered by a read-
3a70: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65  only.**    state
3a80: 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77 69  ment executed wi
3a90: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
3aa0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
3ab0: 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a  , if the error.*
3ac0: 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20 73  *    code were s
3ad0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74  imply returned t
3ae0: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
3af0: 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75  b-tree layer wou
3b00: 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74  ld not.**    aut
3b10: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d  omatically attem
3b20: 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  pt a rollback, a
3b30: 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  s it assumes tha
3b40: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a  t an error in a.
3b50: 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20  **    read-only 
3b60: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
3b70: 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65 72   leave the pager
3b80: 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c   in an internall
3b90: 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a  y inconsistent .
3ba0: 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a  **    state..**.
3bb0: 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67 65  **    * The Page
3bc0: 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
3bd0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d  le is set to som
3be0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
3bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
3c00: 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f     * There are o
3c10: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
3c20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
3c30: 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74 65  s to pages (afte
3c40: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61  r the.**      la
3c50: 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  st reference is 
3c60: 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67 65  dropped the page
3c70: 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61  r should move ba
3c80: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
3c90: 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70  )..**    * The p
3ca0: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69  ager is not an i
3cb0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
3cc0: 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  **    .**.** Not
3cd0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20  es:.**.**   * A 
3ce0: 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69  pager is never i
3cf0: 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f  n WRITER_DBMOD o
3d00: 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  r WRITER_FINISHE
3d10: 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a  D state if the.*
3d20: 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e  *     connection
3d30: 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20   is open in WAL 
3d40: 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e  mode. A WAL conn
3d50: 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ection is always
3d60: 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f   in one.**     o
3d70: 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72  f the first four
3d80: 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   states..**.**  
3d90: 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63   * Normally, a c
3da0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69  onnection open i
3db0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
3dc0: 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47   is never in PAG
3dd0: 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73  ER_OPEN.**     s
3de0: 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20  tate. There are 
3df0: 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20  two exceptions: 
3e00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3e10: 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  r exclusive-mode
3e20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
3e30: 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20   turned on (and 
3e40: 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20  before any read 
3e50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3e60: 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20  tions are .**   
3e70: 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64    executed), and
3e80: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
3e90: 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22  is leaving the "
3ea0: 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a  error state"..**
3eb0: 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f  .**   * See also
3ec0: 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  : assert_pager_s
3ed0: 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  tate()..*/.#defi
3ee0: 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20  ne PAGER_OPEN   
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
3f10: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
3f20: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50       1.#define P
3f30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
3f40: 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65  ED         2.#de
3f50: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3f60: 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20  R_CACHEMOD      
3f70: 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   3.#define PAGER
3f80: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
3f90: 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
3fa0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49   PAGER_WRITER_FI
3fb0: 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23  NISHED       5.#
3fc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
3fd0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
3fe0: 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20     6../*.** The 
3ff0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
4000: 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61  able is almost a
4010: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65  lways set to one
4020: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
4030: 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74  owing locking-st
4040: 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20  ates, according 
4050: 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72  to the lock curr
4060: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a  ently held on.**
4070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4080: 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41  le: NO_LOCK, SHA
4090: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
40a0: 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55  ED_LOCK or EXCLU
40b0: 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68  SIVE_LOCK..** Th
40c0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b  is variable is k
40d0: 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61  ept up to date a
40e0: 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65  s locks are take
40f0: 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62  n and released b
4100: 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f  y.** the pagerLo
4110: 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72  ckDb() and pager
4120: 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70  UnlockDb() wrapp
4130: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
4140: 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72  e VFS xLock() or
4150: 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72   xUnlock() retur
4160: 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65  ns an error othe
4170: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
4180: 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20  SY.** (i.e. one 
4190: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
41a0: 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69  ERR subtypes), i
41b0: 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  t is not clear w
41c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
41d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77   the operation w
41e0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49  as successful. I
41f0: 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74  n these circumst
4200: 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44  ances pagerLockD
4210: 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72  b() and.** pager
4220: 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20  UnlockDb() take 
4230: 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61  a conservative a
4240: 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20  pproach - eLock 
4250: 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65  is always update
4260: 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  d.** when unlock
4270: 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e  ing the file, an
4280: 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77  d only updated w
4290: 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  hen locking the 
42a0: 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56  file if the.** V
42b0: 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65  FS call is succe
42c0: 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c  ssful. This way,
42d0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
42e0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65   variable may be
42f0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73   set.** to a les
4300: 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77  s exclusive (low
4310: 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74  er) value than t
4320: 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20  he lock that is 
4330: 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a  actually held.**
4340: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
4350: 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20  evel, but it is 
4360: 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d  never set to a m
4370: 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61  ore exclusive va
4380: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
4390: 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e  is usually safe.
43a0: 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66   If an xUnlock f
43b0: 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20  ails or appears 
43c0: 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d  to fail, there m
43d0: 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20  ay .** be a few 
43e0: 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28  redundant xLock(
43f0: 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63  ) calls or a loc
4400: 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f  k may be held fo
4410: 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a  r longer than.**
4420: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e   required, but n
4430: 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f  othing really go
4440: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4450: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
4460: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
4470: 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  se file is unloc
4480: 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72  ked as the pager
4490: 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45   moves.** from E
44a0: 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61  RROR to OPEN sta
44b0: 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  te. At this poin
44c0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  t there may be a
44d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
44e0: 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c  e .** in the fil
44f0: 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65  e-system that ne
4500: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
4510: 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f   back (as part o
4520: 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44  f a OPEN->SHARED
4530: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20  .** transition, 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  by the same page
4550: 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e  r or any other).
4560: 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
4570: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69  xUnlock().** fai
4580: 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ls at this point
4590: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
45a0: 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61  s left holding a
45b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
45c0: 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f  , this.** can co
45d0: 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  nfuse the call t
45e0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
45f0: 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65  Lock() call made
4600: 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a   later as part.*
4610: 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  * of hot-journal
4620: 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a   detection..**.*
4630: 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
4640: 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65  Lock() is define
4650: 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74  d as returning t
4660: 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73  rue "if there is
4670: 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20   a RESERVED .** 
4680: 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69  lock held by thi
4690: 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79  s process or any
46a0: 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68   others". So xCh
46b0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
46c0: 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74  may .** return t
46d0: 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
46e0: 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73  caller itself is
46f0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
4700: 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a  USIVE lock (but.
4710: 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20  ** doesn't know 
4720: 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  it because of a 
4730: 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69  previous error i
4740: 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74  n xUnlock). If t
4750: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61  his happens.** a
4760: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot-journal may
4770: 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72   be mistaken for
4780: 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67   a journal being
4790: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61   created by an a
47a0: 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
47b0: 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  tion in another 
47c0: 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67  process, causing
47d0: 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20   SQLite to read 
47e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
47f0: 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c  e.** without rol
4800: 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  ling it back..**
4810: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4820: 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61  nd this, if a ca
4830: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20  ll to xUnlock() 
4840: 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63  fails when unloc
4850: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61  king the.** data
4860: 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f  base in the ERRO
4870: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
4880: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
4890: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a  NKNOWN_LOCK. It.
48a0: 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  ** is only chang
48b0: 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61  ed back to a rea
48c0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  l locking state 
48d0: 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
48e0: 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c  ul call.** to xL
48f0: 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20  ock(EXCLUSIVE). 
4900: 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74  Also, the code t
4910: 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53  o do the OPEN->S
4920: 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e  HARED state tran
4930: 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20  sition.** omits 
4940: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20  the check for a 
4950: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50  hot-journal if P
4960: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
4970: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4980: 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74  K .** lock. Inst
4990: 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20  ead, it assumes 
49a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78  a hot-journal ex
49b0: 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73  ists and obtains
49c0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   an EXCLUSIVE.**
49d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
49e0: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
49f0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
4a00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65  roll it back. Se
4a10: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61  e function.** Pa
4a20: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
4a30: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e  for more detail.
4a40: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  .**.** Pager.eLo
4a50: 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73  ck may only be s
4a60: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4a70: 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  CK when the page
4a80: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45  r is in .** PAGE
4a90: 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f  R_OPEN state..*/
4aa0: 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e  .#define UNKNOWN
4ab0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20  _LOCK           
4ac0: 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f       (EXCLUSIVE_
4ad0: 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41  LOCK+1)../*.** A
4ae0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
4af0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
4b00: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
4b10: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
4b20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
4b30: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
4b40: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
4b50: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
4b60: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
4b70: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
4b80: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
4b90: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
4ba0: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
4bb0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
4bc0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
4bd0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
4be0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
4bf0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
4c00: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
4c10: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
4c20: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
4c30: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
4c40: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4c50: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
4c60: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
4c70: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
4c80: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
4c90: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
4ca0: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
4cb0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
4cc0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
4cd0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
4ce0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4cf0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
4d00: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
4d10: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
4d20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
4d30: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
4d40: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
4d50: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
4d60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
4d70: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
4d80: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
4d90: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
4da0: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
4db0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4dd0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4de0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4df0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e00: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e10: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e20: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e30: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e40: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e50: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e60: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4e80: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4e90: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ea0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4eb0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ec0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ed0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4ee0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4ef0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f20: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f30: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f40: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f50: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f60: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f70: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4f80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4f90: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fa0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fb0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fc0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4fd0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
4fe0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
4ff0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5000: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5010: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5020: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5030: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5040: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5050: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5060: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5070: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5080: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50b0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50c0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50d0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
50e0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
50f0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5100: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5110: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5120: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5130: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5140: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5160: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5170: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
5180: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51b0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
51e0: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
51f0: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5200: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5210: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5220: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5230: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
5240: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
5250: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73  an instance of s
5260: 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64  truct Pager. A d
5270: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
5280: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72   some of the mor
5290: 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62  e important memb
52a0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c  er variables fol
52b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61  lows:.**.** eSta
52c0: 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63  te.**.**   The c
52d0: 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f  urrent 'state' o
52e0: 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
52f0: 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ct. See the comm
5300: 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a  ent and state.**
5310: 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65     diagram above
5320: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
5330: 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  on of the pager 
5340: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f  state..**.** eLo
5350: 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61  ck.**.**   For a
5360: 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61   real on-disk da
5370: 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72  tabase, the curr
5380: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
5390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
53a0: 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  le -.**   NO_LOC
53b0: 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
53c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
53d0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
53e0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74  .**.**   For a t
53f0: 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
5400: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
5410: 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
5420: 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20   require any.** 
5430: 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76    locks), this v
5440: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79  ariable is alway
5450: 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49  s set to EXCLUSI
5460: 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73  VE_LOCK. Since s
5470: 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73  uch.**   databas
5480: 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50  es always have P
5490: 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f  ager.exclusiveMo
54a0: 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63  de==1, this tric
54b0: 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  ks the pager.** 
54c0: 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69    logic into thi
54d0: 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c  nking that it al
54e0: 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68  ready has all th
54f0: 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20  e locks it will 
5500: 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28  ever.**   need (
5510: 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f  and no reason to
5520: 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a   release them)..
5530: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20  **.**   In some 
5540: 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d  (obscure) circum
5550: 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61  stances, this va
5560: 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20  riable may also 
5570: 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55  be set to.**   U
5580: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
5590: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
55a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
55b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
55c0: 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e  or.**   details.
55d0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
55e0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
55f0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
5600: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
5610: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5620: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5630: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
5640: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
5650: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
5660: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
5670: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
5680: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
5690: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
56a0: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
56b0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
56c0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
56d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
56e0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
56f0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
5700: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
5710: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
5720: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
5730: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5740: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
5750: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
5760: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
5770: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
5780: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
5790: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
57a0: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
57b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
57c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
57d0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
57e0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
57f0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
5800: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
5810: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
5820: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5830: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
5840: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
5850: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
5860: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
5870: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
5880: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
5890: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
58a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
58b0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
58c0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
58d0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
58e0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
58f0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
5900: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61  ted..**.** setMa
5910: 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ster.**.**   Whe
5920: 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  n PagerCommitPha
5930: 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65  seOne() is calle
5940: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  d to commit a tr
5950: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
5960: 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e  y.**   (or may n
5970: 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61  ot) specify a ma
5980: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
5990: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
59a0: 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a  into the .**   j
59b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
59c0: 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  re it is synced 
59d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20  to disk..**.**  
59e0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
59f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  a journal file c
5a00: 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72  ontains a master
5a10: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5a20: 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74   affects .**   t
5a30: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
5a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a50: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66   is finalized af
5a60: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
5a70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d  ion is .**   com
5a80: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
5a90: 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69   back when runni
5aa0: 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ng in "journal_m
5ab0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64  ode=PERSIST" mod
5ac0: 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75  e..**   If a jou
5ad0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
5ae0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  ot contain a mas
5af0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b00: 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20  ter, it is.**   
5b10: 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65  finalized by ove
5b20: 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72  rwriting the fir
5b30: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
5b40: 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49  r with zeroes. I
5b50: 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63  f.**   it does c
5b60: 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d  ontain a master-
5b70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b90: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a   is finalized .*
5ba0: 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e  *   by truncatin
5bb0: 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  g it to zero byt
5bc0: 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74  es, just as if t
5bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65  he connection we
5be0: 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67  re .**   running
5bf0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5c00: 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65  e=truncate" mode
5c10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61  ..**.**   Journa
5c20: 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e  l files that con
5c30: 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72  tain master jour
5c40: 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e  nal pointers can
5c50: 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64  not be finalized
5c60: 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20  .**   simply by 
5c70: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
5c90: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5ca0: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61  , as the.**   ma
5cb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
5cc0: 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72  nter could inter
5cd0: 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f  fere with hot-jo
5ce0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
5cf0: 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65  f any.**   subse
5d00: 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70  quently interrup
5d10: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
5d20: 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20  that reuses the 
5d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5d40: 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69  .**   The flag i
5d50: 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f  s cleared as soo
5d60: 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n as the journal
5d70: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5d80: 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20  ed (either.**   
5d90: 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  by PagerCommitPh
5da0: 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52  aseTwo or PagerR
5db0: 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20  ollback). If an 
5dc0: 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74  IO error prevent
5dd0: 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s the.**   journ
5de0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
5df0: 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ng successfully 
5e00: 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73  finalized, the s
5e10: 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a  etMaster flag.**
5e20: 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e     is cleared an
5e30: 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61  yway (and the pa
5e40: 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f  ger will move to
5e50: 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a   ERROR state)..*
5e60: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
5e70: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
5e80: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77  **.**   These tw
5e90: 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  o boolean variab
5ea0: 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  les control the 
5eb0: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63  behaviour of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7c70: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7c80: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7c90: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
7cf0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
7d00: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
7d10: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
7d20: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
7d30: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
7d40: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
7d50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d60: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
7d70: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
7d80: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
7d90: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7da0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
7db0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
7dc0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
7dd0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
7de0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
7df0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
7e00: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
7e10: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7e40: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
7e50: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e70: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
7e80: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
7e90: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
7ea0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
7eb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
7ec0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
7ed0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
7ee0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
7ef0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
7f00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7f10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7f20: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
7f30: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
7f40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
7f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7f60: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
7f70: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
7f80: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
7f90: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
7fa0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
7fb0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
7fc0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
7fd0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
7fe0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
7ff0: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8000: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8010: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8020: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8030: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8040: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8060: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8070: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8080: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
8090: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
80a0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
80b0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
80c0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
80d0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
80e0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
80f0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8100: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8110: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8120: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8130: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8140: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8150: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
8160: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
8170: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
8180: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8190: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
81a0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
81b0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
81c0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81e0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
81f0: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8200: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8210: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8230: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8240: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8250: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
8260: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
8270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8280: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8290: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
82a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
82b0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
82c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
82d0: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
82e0: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
82f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8300: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8310: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8320: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8330: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8340: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
8350: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
8360: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
8370: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
8380: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
8390: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
83a0: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
83b0: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
83c0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
83d0: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
83e0: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
83f0: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8400: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8410: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8420: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
8430: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
8440: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
8450: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
8460: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
8470: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
8480: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
8490: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
84a0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
84b0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
84c0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
84d0: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
84e0: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
84f0: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8500: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8510: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8520: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
8530: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8540: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
8550: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
8560: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
8570: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
8580: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8590: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
85a0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
85b0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
85c0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
85d0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
85e0: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
85f0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8600: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8610: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8620: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8630: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
8640: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8650: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
8660: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
8670: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
8680: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8690: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
86a0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
86b0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
86c0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
86d0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
86e0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
86f0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8700: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8710: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8720: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
8730: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
8740: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
8750: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
8760: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
8770: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
8780: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8790: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
87a0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
87b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
87c0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
87d0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
87e0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
87f0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8800: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8810: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8820: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
8830: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
8840: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
8850: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
8860: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
8870: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8880: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8890: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
88a0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
88b0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
88c0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
88d0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
88e0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
88f0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8900: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8910: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8920: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8930: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8940: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8950: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8960: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8970: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8980: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8990: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
89a0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
89b0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
89c0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
89d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
89e0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
89f0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8a00: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8a10: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8a20: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8a30: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8a40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8a50: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8a60: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8a70: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8a80: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8a90: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8aa0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8ab0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8ac0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8ae0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8af0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8b00: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8b10: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8b20: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8b30: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8b40: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8b50: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8b60: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8b70: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8b80: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8b90: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8ba0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8bb0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8bc0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8bd0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8be0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8bf0: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8c00: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8c10: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8c20: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8c30: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8c40: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8c50: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8c60: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8c70: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8c80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8c90: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8ca0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8cb0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
8cc0: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
8cd0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
8ce0: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
8cf0: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
8d00: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
8d10: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
8d20: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
8d30: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
8d40: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
8d50: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
8d60: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
8d70: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
8d80: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
8d90: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
8da0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
8db0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
8dc0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
8dd0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
8de0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
8df0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
8e00: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
8e10: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
8e20: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
8e30: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
8e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8e50: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
8e60: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
8e70: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
8e80: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
8e90: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
8ea0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
8eb0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
8ec0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8ed0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
8ee0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
8ef0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
8f00: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
8f10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
8f20: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
8f30: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
8f40: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
8f50: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
8f60: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
8f70: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
8f80: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
8f90: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
8fa0: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
8fb0: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
8fc0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
8fd0: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
8fe0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
8ff0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
9000: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
9010: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
9020: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
9030: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ods)../*.** Retu
9040: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
9050: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
9060: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
9070: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
9080: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9090: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
90a0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
90b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
90c0: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
90d0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
90e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
90f0: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9100: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9110: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9120: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9130: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9140: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9150: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9160: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9170: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9180: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9190: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
91a0: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
91b0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
91c0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
91d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
91e0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
91f0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9200: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9210: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9220: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9230: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9240: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9250: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9260: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9270: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9280: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9290: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
92a0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
92b0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
92c0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
92d0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
92e0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
92f0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9300: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9310: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9320: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9330: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9340: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9350: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9360: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9370: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9380: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9390: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
93a0: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
93b0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
93c0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
93d0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
93e0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
93f0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9400: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9410: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9420: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9430: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9440: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9450: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9460: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9470: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9480: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9490: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
94a0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
94b0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
94c0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
94d0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
94e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
94f0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9500: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9510: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9520: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9530: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9540: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9550: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9560: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9570: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9580: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9590: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
95a0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
95b0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
95c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
95d0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
95e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
95f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9600: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9610: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9620: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9630: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9640: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9650: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9660: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9670: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9680: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9690: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
96a0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
96b0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
96c0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
96d0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
96e0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
96f0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9700: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9710: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9720: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9730: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9740: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9750: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
9760: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
9770: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
9780: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9790: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
97a0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
97b0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
97c0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
97d0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
97e0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
97f0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9800: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9810: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9820: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
9830: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
9840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
9850: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
9860: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
9870: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9880: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9890: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
98a0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
98b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
98c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
98d0: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
98e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
98f0: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9900: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9910: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9920: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9930: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9940: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9950: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9960: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9970: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9980: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
9990: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
99a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
99b0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
99c0: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
99d0: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
99e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
99f0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
9a00: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
9a10: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
9a20: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
9a30: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
9a40: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
9a50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9a60: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9a70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9a80: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9a90: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
9aa0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
9ab0: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
9ac0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
9ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9ae0: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
9af0: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
9b00: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9b10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9b20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9b30: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9b40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9b50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
9b60: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
9b70: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9b80: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9b90: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
9ba0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9bb0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9bc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9bd0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9be0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9bf0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
9c00: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
9c10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c20: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9c30: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9c40: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9c50: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9c60: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9c70: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9c90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ca0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9cb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9cc0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9cd0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ce0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9cf0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
9d00: 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Master==0 );.   
9d10: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9d20: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
9d30: 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20  _CACHEMOD:.     
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d50: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9d80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9d90: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9da0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9db0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69  .        /* It i
9dc0: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
9dd0: 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
9de0: 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65  wal here that ne
9df0: 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20  ither the.      
9e00: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9e10: 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69  e nor the WAL fi
9e20: 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69  le are open. Thi
9e30: 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67  s happens during
9e40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f  .        ** a ro
9e50: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
9e60: 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73  on that switches
9e70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
9e80: 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a  de=off.        *
9e90: 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  * to journal_mod
9ea0: 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  e=wal..        *
9eb0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9ec0: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
9ed0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
9ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
9ef0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
9f00: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9f10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f30: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
9f40: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9f50: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9f60: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
9f70: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
9f80: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f90: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9fa0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
9fb0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
9fc0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9fd0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9fe0: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
9ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a000: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a010: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
a020: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a030: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a040: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a050: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a060: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a070: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a080: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a090: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a0a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
a0b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a0d0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a0e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a0f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a100: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a110: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a120: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a130: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a140: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a160: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a170: 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  <=pPager->dbHint
a180: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a190: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a1a0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a1b0: 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  SHED:.      asse
a1c0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a1d0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a1e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a1f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a200: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a210: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a220: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a240: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a250: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a260: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a270: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a280: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a290: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a2a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a2b0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a2c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a2d0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a2e0: 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20  ERROR:.      /* 
a2f0: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  There must be at
a300: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
a310: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
a320: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66   to the pager if
a330: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52  .      ** in ERR
a340: 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
a350: 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68  ise the pager sh
a360: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
a370: 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20  y dropped.      
a380: 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  ** back to OPEN 
a390: 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
a3a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a3b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
a3c0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a3d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a3e0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
a3f0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a400: 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  >0 );.      brea
a410: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
a420: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a430: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
a440: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a450: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
a460: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
a470: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
a480: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
a490: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
a4a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
a4b0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
a4c0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a4d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
a4e0: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
a4f0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
a500: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
a510: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
a520: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
a530: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
a540: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
a550: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
a560: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
a570: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
a580: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a590: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a5a0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
a5b0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
a5c0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
a5d0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
a5e0: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
a5f0: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
a600: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
a610: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
a620: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
a630: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
a640: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
a650: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
a660: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
a670: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
a680: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
a690: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
a6a0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
a6b0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
a6c0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
a6d0: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
a6e0: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
a6f0: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
a700: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
a710: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
a720: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
a730: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
a740: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
a750: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
a760: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
a770: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
a780: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
a790: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
a7a0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
a7b0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
a7c0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
a7d0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7e0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
a7f0: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
a800: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
a810: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a820: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a830: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
a840: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a850: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a860: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
a870: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
a880: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a890: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a8a0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
a8b0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
a8c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a8d0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
a8e0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
a8f0: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
a900: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
a910: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
a920: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
a930: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
a940: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
a950: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
a960: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
a970: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
a980: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
a990: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
a9a0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
a9b0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
a9c0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
a9d0: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
a9e0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
a9f0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
aa00: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
aa10: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
aa20: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
aa30: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
aa40: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
aa50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aa60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aa70: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
aa80: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
aa90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aaa0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aab0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
aac0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
aad0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
aae0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
aaf0: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
ab00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ab10: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ab20: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
ab30: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
ab40: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
ab50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ab60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
ab70: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
ab80: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
ab90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aba0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
abb0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
abc0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
abd0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
abe0: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
abf0: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
ac00: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
ac10: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
ac20: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
ac30: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
ac40: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
ac50: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
ac60: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
ac70: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
ac80: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
ac90: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
aca0: 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  f it is necessar
acb0: 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20  y to write page 
acc0: 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75  *pPg into the su
acd0: 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20  b-journal..** A 
ace0: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
acf0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ad00: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
ad10: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ad20: 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65  e.** or more ope
ad30: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72  n savepoints for
ad40: 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20   which:.**.**   
ad50: 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  * The page-numbe
ad60: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
ad70: 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72  r equal to Pager
ad80: 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c  Savepoint.nOrig,
ad90: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
ada0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
adb0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75  g to the page-nu
adc0: 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20  mber is not set 
add0: 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  in.**     PagerS
ade0: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
adf0: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
ae00: 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65   int subjRequire
ae10: 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  sPage(PgHdr *pPg
ae20: 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  ){.  Pgno pgno =
ae30: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61   pPg->pgno;.  Pa
ae40: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ae50: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
ae60: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ae70: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
ae80: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  int; i++){.    P
ae90: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aea0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
aeb0: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
aec0: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
aed0: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
aee0: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
aef0: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
af00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
af10: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
af20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
af30: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
af40: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
af50: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
af60: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
af70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
af80: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
af90: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
afa0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
afb0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
afc0: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
afd0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
afe0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
aff0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
b000: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b010: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
b020: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
b030: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
b040: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b050: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
b060: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
b070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b080: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b090: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
b0a0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
b0b0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b0c0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b0d0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b0e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b0f0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b100: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b110: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b120: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b130: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b140: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b150: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b160: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b170: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b180: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b190: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b1a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b1b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b1c0: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b1d0: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b1e0: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b1f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b200: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b210: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b220: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b230: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b240: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b250: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b260: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b270: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b280: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b290: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b2a0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b2c0: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b2d0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b2e0: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b2f0: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b300: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b310: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b320: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b330: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b340: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b350: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b360: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b370: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b380: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b390: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b3a0: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b3b0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b3c0: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b3d0: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b3e0: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b3f0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b400: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b410: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b420: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b430: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b440: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b450: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b460: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b470: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b480: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b490: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b4a0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b4b0: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b4c0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b4d0: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b4e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b4f0: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b500: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b510: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b520: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b530: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
b540: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
b550: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
b560: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
b570: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
b580: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b590: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b5a0: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
b5b0: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
b5c0: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
b5d0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
b5e0: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
b5f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
b600: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
b610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
b620: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b630: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
b640: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
b650: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
b660: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b670: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
b690: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20  ACE(("UNLOCK %p 
b6a0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
b6b0: 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74  Lock)).  }.  ret
b6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b6d0: 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   Lock the databa
b6e0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b6f0: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b700: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41  st be either SHA
b710: 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53  RED_LOCK,.** RES
b720: 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58  ERVED_LOCK or EX
b730: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66  CLUSIVE_LOCK. If
b740: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73   the caller is s
b750: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
b760: 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  he.** Pager.eLoc
b770: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
b780: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
b790: 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ate. .**.** Exce
b7a0: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b7b0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b7c0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b7d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b7e0: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
b7f0: 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c  ot modify it unl
b800: 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b  ess the new lock
b810: 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43  ing state is EXC
b820: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a  LUSIVE_LOCK. .**
b830: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b840: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b850: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
b860: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b870: 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69  ation .** of thi
b880: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b890: 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67   pagerLockDb(Pag
b8a0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b8b0: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
b8c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
b8d0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
b8e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
b8f0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
b900: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
b910: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
b920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b930: 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61  ock<eLock || pPa
b940: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
b950: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
b960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
b970: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
b980: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
b990: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b9a0: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
b9b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
b9c0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
b9d0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
b9e0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
b9f0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
ba00: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
ba10: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
ba20: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
ba30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ba40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ba50: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
ba60: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
ba70: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
ba80: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
ba90: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
baa0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
bab0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
bac0: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
bad0: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
bae0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
baf0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
bb00: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
bb10: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
bb20: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
bb30: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
bb40: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
bb50: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
bb60: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
bb70: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
bb80: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bb90: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
bba0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
bbb0: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
bbc0: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
bbd0: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
bbe0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
bbf0: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
bc00: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
bc10: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
bc20: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
bc30: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
bc40: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
bc50: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
bc60: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
bc70: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
bc80: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
bc90: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
bca0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bcb0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
bcc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bcd0: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
bce0: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
bcf0: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
bd00: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
bd10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bd20: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
bd30: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
bd40: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
bd50: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
bd60: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
bd70: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
bd80: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
bd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bdb0: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
bdc0: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
bdd0: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bdf0: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
be00: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
be30: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
be40: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
be50: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
be60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
be70: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
be80: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
be90: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
bea0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
beb0: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
bec0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
bed0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
bee0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
bef0: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
bf00: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
bf10: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
bf20: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
bf30: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
bf40: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
bf50: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
bf60: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
bf70: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
bf80: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
bf90: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
bfa0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bfb0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
bfc0: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
bfd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
bfe0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
bff0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c000: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c010: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c020: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c030: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c040: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c050: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c060: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c070: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c080: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c090: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c0a0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c0b0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c0c0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c0d0: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c0e0: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c0f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c100: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c110: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c130: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c140: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c150: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c160: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c170: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c180: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c190: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c1a0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c1b0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c1c0: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c1d0: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c1e0: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c1f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c200: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c210: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c220: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c230: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c240: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c250: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c260: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c270: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c280: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c290: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c2a0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c2b0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c2c0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c2d0: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c2e0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c2f0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c300: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c310: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c320: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c330: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c340: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c350: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
c360: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
c370: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
c380: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
c390: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
c3a0: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
c3b0: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
c3c0: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
c3d0: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
c3e0: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
c3f0: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
c400: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
c410: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
c420: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
c430: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
c440: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
c450: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
c460: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
c470: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
c480: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
c490: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c4a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
c4b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
c4c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c4d0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
c4e0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
c4f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
c500: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
c510: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c520: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
c530: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
c540: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
c550: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
c560: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
c570: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
c580: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
c590: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
c5a0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
c5b0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
c5c0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
c5d0: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
c5e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c5f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
c610: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
c620: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
c630: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
c640: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
c650: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
c660: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
c670: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
c680: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
c690: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
c6a0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
c6b0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
c6c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c6d0: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
c6e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
c6f0: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
c700: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
c710: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
c720: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
c730: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
c740: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
c750: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
c760: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c770: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
c780: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
c790: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
c7a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7b0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c7c0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
c7d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
c7e0: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
c7f0: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
c800: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c810: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
c820: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
c830: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
c840: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
c850: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
c860: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
c870: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
c880: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
c890: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
c8a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c8b0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c8c0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
c8d0: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
c8e0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
c8f0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
c900: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c910: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
c920: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
c930: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
c940: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
c950: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c960: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
c970: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
c980: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
c990: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
c9a0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
c9b0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
c9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c9d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
c9e0: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
c9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
ca00: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
ca10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ca20: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
ca50: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
ca60: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
ca70: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
caa0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
cab0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
cac0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
cad0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
cae0: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
caf0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cb00: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
cb10: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
cb20: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
cb30: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
cb40: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
cb50: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
cb60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
cb70: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
cb80: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
cb90: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
cba0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cbb0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cbc0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
cbd0: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
cbe0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cc00: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
cc10: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
cc20: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
cc30: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
cc40: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
cc50: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
cc60: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
cc70: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
cc80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cc90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
cca0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
ccb0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
ccc0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
ccd0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
cce0: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
ccf0: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
cd00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cd10: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
cd20: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
cd30: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
cd40: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
cd50: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
cd60: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
cd70: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
cd80: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
cd90: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
cda0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
cdb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cdc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cdd0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
cde0: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
cdf0: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
ce00: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
ce10: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
ce20: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
ce30: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
ce40: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
ce50: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
ce60: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
ce70: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
ce80: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
ce90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ceb0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
cec0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
ced0: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
cee0: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
cef0: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
cf00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cf10: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
cf20: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
cf30: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
cf40: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
cf50: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
cf60: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
cf70: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
cf80: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
cf90: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
cfa0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
cfd0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
cfe0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
cff0: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
d000: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
d010: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d030: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
d060: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
d070: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
d080: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
d090: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
d0a0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
d0b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
d0c0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
d0d0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
d0e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d0f0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
d100: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d110: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
d120: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
d130: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
d140: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d150: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
d160: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
d170: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d180: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
d190: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
d1a0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d1b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d1c0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d1d0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d1e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d1f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d210: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
d220: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
d230: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
d240: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
d250: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
d260: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
d270: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
d280: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
d290: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d2a0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
d2b0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
d2c0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
d2d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
d2e0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d2f0: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
d300: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
d310: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
d320: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d330: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
d340: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
d350: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
d360: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
d370: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
d380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
d390: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
d3a0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
d3b0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
d3c0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
d3d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
d3e0: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
d3f0: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
d400: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
d410: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
d420: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
d430: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
d440: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
d450: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
d460: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
d470: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
d480: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
d490: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
d4a0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
d4b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
d4c0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
d4d0: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
d4e0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
d4f0: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
d500: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
d510: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
d520: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
d530: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
d540: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
d550: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
d560: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
d570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
d580: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
d590: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
d5a0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
d5b0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
d5c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d5f0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d600: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d610: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
d620: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
d630: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d640: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
d650: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
d660: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
d670: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d680: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
d690: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
d6a0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
d6b0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
d6c0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
d6d0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
d6e0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
d6f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
d700: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d710: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d720: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
d730: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
d740: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
d750: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d760: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
d770: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
d780: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
d790: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
d7a0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
d7b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d7c0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
d7d0: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
d7e0: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
d7f0: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
d800: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d810: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d820: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d830: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d840: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d850: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d860: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d870: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d880: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
d890: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
d8a0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
d8b0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
d8c0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
d8d0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
d8e0: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
d8f0: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
d900: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
d910: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
d920: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
d930: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
d940: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
d950: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
d960: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
d970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d980: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
d990: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
d9a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
d9b0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
d9c0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
d9d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d9e0: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
d9f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
da00: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
da10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
da20: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
da30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
da40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
da50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
da60: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
da70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
da80: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
da90: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
daa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
dab0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
dac0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
dad0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
dae0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
daf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
db00: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
db10: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
db20: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
db30: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
db40: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
db50: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
db60: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
db70: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
db80: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
db90: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dba0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
dbb0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
dbc0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
dbd0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
dbe0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
dbf0: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
dc00: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
dc10: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
dc20: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
dc30: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
dc40: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
dc50: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
dc60: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dc70: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
dc80: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
dc90: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
dca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dcb0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
dcc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
dcd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dce0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
dcf0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dd00: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
dd10: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
dd20: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
dd30: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
dd40: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
dd50: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dd60: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
dd70: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
dd80: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
dd90: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
dda0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
ddb0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
dde0: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
ddf0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
de20: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
de30: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
de40: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
de50: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
de60: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
de70: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
de80: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
de90: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
dea0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
deb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dec0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
ded0: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
dee0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
def0: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
df00: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
df10: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
df20: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
df30: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
df40: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
df50: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
df60: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
df70: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
df80: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
df90: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
dfa0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
dfb0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
dfc0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
dfd0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
dfe0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
dff0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e000: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e010: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e020: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e030: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e040: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e050: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e060: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e070: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e080: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e090: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e0a0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e0b0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e0c0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e0d0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e0e0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e0f0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e100: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e110: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e120: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e130: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e140: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e150: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e160: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e170: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e180: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e190: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e1a0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e1b0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e1c0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e1d0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e1e0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e1f0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e200: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e210: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e220: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e230: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e240: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e250: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e260: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e270: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e280: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e290: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e2a0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e2b0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e2c0: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e2d0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e2e0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e2f0: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e300: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e310: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e320: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e330: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e340: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e350: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e360: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e370: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e380: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e390: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e3a0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e3b0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e3c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e3d0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e3e0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e3f0: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e400: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e410: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e420: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e430: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e440: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e450: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e460: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e470: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e480: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e490: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e4a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e4b0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e4c0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e4d0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e4e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e4f0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e500: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e510: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e520: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e530: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e540: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e550: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e560: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e570: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e580: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e590: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e5a0: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e5b0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e5c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e5d0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e5e0: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e5f0: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
e600: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e610: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e620: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e630: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e640: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e650: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e660: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e670: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e680: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e690: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e6a0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e6b0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e6c0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e6d0: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e6e0: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e6f0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e700: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e710: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e720: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e730: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e740: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e750: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e760: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e770: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e780: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e790: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e7a0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e7b0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e7c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e7d0: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e7e0: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e7f0: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e800: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e810: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e820: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e830: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e840: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e850: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e860: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e870: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e880: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
e890: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
e8a0: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
e8b0: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
e8c0: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
e8d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e8e0: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
e8f0: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
e900: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e910: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
e920: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
e930: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
e940: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
e950: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
e960: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e970: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
e980: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e990: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
e9a0: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
e9b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
e9c0: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
e9d0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
e9e0: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
e9f0: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
ea00: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
ea10: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
ea20: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
ea30: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
ea40: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ea50: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
ea60: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
ea70: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
ea80: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
ea90: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
eaa0: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
eab0: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
eac0: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
ead0: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
eae0: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
eaf0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
eb00: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
eb10: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
eb20: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
eb30: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
eb40: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
eb50: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
eb60: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
eb70: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
eb80: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
eb90: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
eba0: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
ebb0: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
ebc0: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
ebd0: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
ebe0: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
ebf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
ec00: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
ec10: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
ec20: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
ec30: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
ec40: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
ec50: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
ec60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ec70: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
ec80: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ec90: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
eca0: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ecb0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ecc0: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ecd0: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ece0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ecf0: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ed00: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ed10: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
ed20: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
ed30: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
ed40: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
ed50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ed60: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
ed70: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
ed80: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ed90: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
eda0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
edb0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
edc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edd0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ede0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
edf0: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ee00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ee10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
ee20: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
ee30: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
ee40: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
ee50: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
ee60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
ee70: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
ee80: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
ee90: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
eea0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
eeb0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
eec0: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
eed0: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
eee0: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
eef0: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
ef00: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
ef10: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
ef20: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
ef30: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
ef40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
ef50: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
ef60: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
ef70: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
ef80: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
ef90: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
efa0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
efb0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
efc0: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
efd0: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
efe0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
eff0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f000: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f010: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f020: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f030: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f040: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f050: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f060: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f070: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f080: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f090: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f0a0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f0b0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f0c0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f0d0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f0e0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f0f0: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f100: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f110: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f120: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f130: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f140: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f150: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f160: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f180: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f190: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1b0: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f1c0: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f1d0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f1f0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f200: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f210: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f220: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f240: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f250: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f260: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f270: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f280: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f290: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f2a0: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f2b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f2e0: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f2f0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f300: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f310: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f320: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f330: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f350: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f360: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f370: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f380: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f390: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f3a0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f3b0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f3c0: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f3d0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f3e0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f3f0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f400: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f410: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f420: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f430: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f440: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f450: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f460: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f470: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f480: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f490: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f4a0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f4b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f4c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f4d0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f4e0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f4f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f500: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f510: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f520: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f530: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f540: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f550: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f560: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f570: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f580: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f590: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f5a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f5b0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f5c0: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f5d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f5e0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f5f0: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f600: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f610: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f620: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f630: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f640: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f650: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f660: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f670: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f680: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f690: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f6a0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f6b0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f6c0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f6d0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f6e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f710: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f720: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f730: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f740: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f750: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f760: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f770: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f780: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f790: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f7a0: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f7b0: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f7c0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f7d0: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f7e0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f7f0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f800: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f810: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f820: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f830: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f840: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f850: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f860: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f870: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f880: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f890: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f8a0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f8b0: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
f8c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f8d0: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
f8e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
f900: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
f910: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
f920: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
f930: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
f940: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
f950: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
f960: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
f970: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
f980: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
f990: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
f9a0: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
f9b0: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
f9c0: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
f9d0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
f9e0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f9f0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa00: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
fa10: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
fa20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fa30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fa40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fa50: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
fa60: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
fa70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fa80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
fa90: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
faa0: 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
fab0: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
fac0: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
fad0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
fae0: 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
faf0: 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
fb00: 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
fb10: 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
fb20: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
fb30: 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
fb40: 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
fb50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fb60: 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
fb70: 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
fb80: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fb90: 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
fba0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
fbb0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
fbc0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
fbd0: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
fbe0: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
fbf0: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
fc00: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
fc10: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
fc20: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
fc30: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
fc40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fc50: 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
fc60: 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
fc70: 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
fc80: 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
fc90: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
fca0: 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
fcb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
fcc0: 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
fce0: 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
fcf0: 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
fd00: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
fd10: 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
fd20: 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
fd30: 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
fd40: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
fd50: 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
fd60: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
fd70: 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
fd80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
fd90: 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
fda0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
fdb0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
fdc0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
fdd0: 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
fde0: 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
fdf0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
fe00: 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
fe10: 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
fe20: 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
fe30: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
fe40: 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
fe50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
fe60: 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
fe70: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
fe80: 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
fe90: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
fea0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
feb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
fec0: 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
fed0: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
fee0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
fef0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
ff00: 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
ff10: 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
ff20: 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
ff30: 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
ff40: 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
ff50: 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
ff60: 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
ff70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ff80: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
ff90: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
ffa0: 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
ffb0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
ffc0: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
ffd0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
ffe0: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
fff0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10000 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10010 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10020 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
10030 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
10040 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
10050 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
10060 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
10070 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
10080 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10090 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
100a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
100b0 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
100c0 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
100d0 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
100e0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
100f0 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10100 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10110 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10120 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
10130 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
10140 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
10150 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10160 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
10170 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
10180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10190 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
101a0 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
101b0 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
101c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
101d0 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
101e0 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
101f0 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10200 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10210 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10220 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
10230 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
10240 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10250 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
10260 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
10270 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
10280 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10290 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
102a0 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
102b0 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
102c0 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
102d0 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
102e0 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
102f0 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10300 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10310 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10320 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10330 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10340 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10350 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10360 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10370 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10380 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10390 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
103a0 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
103b0 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
103c0 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
103d0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
103e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
103f0 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10400 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10410 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10420 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10430 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10440 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10450 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10460 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10470 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10480 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10490 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
104a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
104b0 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
104c0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
104d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
104e0 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
104f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10500 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10510 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10520 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10550 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10580 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10590 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
105c0 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
105d0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
105e0 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10600 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10610 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10620 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10640 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10650 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10660 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10670 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10680 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10690 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
106a0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
106b0 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
106c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
106d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
106e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
106f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10700 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10710 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
10720 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
10730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10740 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
10750 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
10760 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
10770 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
10780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
10790 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
107a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
107b0 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
107c0 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
107d0 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
107e0 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
107f0 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
10800 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
10810 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
10820 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
10830 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
10840 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
10850 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
10860 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
10870 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
10880 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
10890 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
108a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
108b0 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
108c0 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
108d0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
108e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
108f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
10900 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
10910 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10920 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
10930 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
10940 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10950 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
10960 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
10970 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
10980 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
10990 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
109a0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
109b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
109c0 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
109d0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
109e0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
109f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
10a00 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
10a10 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10a20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10a30 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
10a40 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
10a50 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10a60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10a70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10a80 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
10a90 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
10aa0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10ab0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10ac0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10ad0 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
10ae0 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
10af0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10b00 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10b10 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10b20 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
10b30 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10b40 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10b50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
10b60 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
10b70 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10b80 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
10b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10bb0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
10bc0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
10bd0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
10be0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
10bf0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
10c00 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
10c10 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
10c20 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
10c30 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
10c40 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
10c50 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
10c60 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
10c70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
10c80 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
10c90 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
10ca0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
10cb0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
10cc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
10cd0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
10ce0 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
10cf0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
10d00 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
10d10 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
10d20 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
10d30 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
10d40 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
10d50 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
10d60 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
10d70 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
10d80 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
10d90 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
10da0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
10db0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
10dc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10dd0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
10de0 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
10df0 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
10e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
10e10 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
10e20 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
10e30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
10e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10e50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10e60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
10e70 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
10e80 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
10e90 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
10ea0 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
10eb0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
10ec0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
10ed0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
10ee0 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
10ef0 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
10f00 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
10f10 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
10f20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
10f30 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
10f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10f60 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
10f70 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
10f80 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
10f90 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
10fa0 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
10fb0 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
10fc0 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
10fd0 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
10fe0 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
10ff0 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
11000 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
11010 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
11020 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
11030 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
11040 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
11050 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
11060 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11070 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11080 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11090 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
110a0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
110b0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61  er){.  sqlite3Ba
110c0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
110d0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
110e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
110f0 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
11100 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  he);.}../*.** Fr
11110 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11120 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11130 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11140 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11150 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11160 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
11170 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
11180 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11190 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
111a0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
111b0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
111c0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
111d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
111e0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
111f0 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11200 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11220 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11230 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11240 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11250 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11260 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11270 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
11280 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11290 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
112a0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
112b0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
112c0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
112d0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
112e0 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
112f0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11310 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11320 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11330 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
11340 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
11350 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11360 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11370 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
11380 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
11390 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
113a0 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
113b0 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
113c0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
113d0 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
113e0 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
113f0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11410 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11420 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
11430 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
11440 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
11450 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
11460 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
11470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11480 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
11490 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
114a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
114b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
114c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
114d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
114e0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
114f0 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11500 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11510 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11520 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11530 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11540 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
11550 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
11560 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
11570 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
11580 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
11590 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
115a0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
115b0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
115c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
115d0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
115e0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
115f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11610 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11620 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11630 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11640 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
11650 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11660 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
11670 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
11680 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
11690 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
116a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
116b0 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
116c0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
116d0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
116e0 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
116f0 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11700 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11710 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11720 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
11730 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
11740 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
11750 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
11760 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
11770 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
11780 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
117a0 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
117b0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
117c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
117d0 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
117e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
117f0 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11800 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11810 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11820 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
11830 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
11840 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
11850 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11860 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
11870 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
11880 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11890 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
118a0 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
118b0 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
118c0 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
118d0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
118e0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
118f0 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11900 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11910 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11920 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11930 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11940 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11950 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11960 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11970 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11980 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11990 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
119a0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
119b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
119c0 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
119d0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
119e0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
119f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11a00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11a10 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11a20 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11a30 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11a40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
11a60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11a70 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
11a80 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
11a90 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
11aa0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
11ab0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11ac0 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11ad0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11ae0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11af0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b10 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11b20 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11b30 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11b40 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11b50 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11b60 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11b70 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11b80 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11b90 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11ba0 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11bb0 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11bc0 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11bd0 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11bf0 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11c00 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11c10 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11c20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11c30 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11c40 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11c50 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11c60 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11c70 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11c80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11c90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ca0 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
11cb0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11cc0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11cd0 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
11ce0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11cf0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11d00 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
11d10 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11d20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11d30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
11d40 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
11d50 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11d60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
11d70 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
11d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11d90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11da0 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
11db0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
11dc0 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
11dd0 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
11de0 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
11df0 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
11e00 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
11e10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
11e20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11e30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
11e40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
11e50 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
11e60 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
11e70 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
11e80 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
11e90 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
11ea0 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
11eb0 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
11ec0 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
11ed0 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
11ee0 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
11ef0 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
11f00 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
11f10 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
11f20 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
11f30 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
11f40 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
11f50 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
11f60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
11f70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
11f80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11f90 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
11fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
11fb0 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
11fc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11fd0 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
11fe0 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
11ff0 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
12000 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
12010 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
12020 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
12030 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
12040 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
12050 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
12060 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
12070 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
12080 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
12090 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
120a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
120b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
120c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
120d0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
120e0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
120f0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12100 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12110 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
12130 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
12140 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
12150 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
12160 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
12170 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
12180 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
12190 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
121a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
121b0 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
121c0 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
121d0 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
121e0 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
121f0 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12200 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12210 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12220 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
12230 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12240 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12250 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
12260 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12270 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12280 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12290 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
122a0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
122b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
122c0 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
122d0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
122e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
122f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12300 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12310 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12320 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12330 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
12340 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12350 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
12360 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
12370 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
12380 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12390 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
123a0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
123b0 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
123c0 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
123d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
123e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
123f0 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12400 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12410 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12420 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12430 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
12440 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
12450 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
12460 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
12470 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
12480 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12490 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
124a0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
124b0 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
124c0 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
124d0 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
124e0 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
124f0 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12500 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12510 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12520 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12530 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
12540 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
12550 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
12560 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12570 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
12580 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12590 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
125a0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
125b0 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
125c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
125d0 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
125e0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
125f0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12600 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12610 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12620 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
12630 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
12640 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
12650 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
12660 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12670 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
12680 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12690 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
126a0 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
126b0 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
126c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
126d0 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
126e0 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
126f0 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12700 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12710 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12720 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
12730 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
12740 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12750 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
12760 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
12770 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
12780 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
127a0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
127b0 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
127c0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
127d0 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
127e0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
127f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12800 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12810 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12820 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
12830 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
12840 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
12850 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
12860 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
12870 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
12880 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12890 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
128a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
128b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
128c0 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
128d0 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
128e0 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
128f0 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
12900 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
12910 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
12920 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
12930 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
12940 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
12950 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
12960 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
12970 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
12980 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
12990 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
129a0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
129b0 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
129c0 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
129d0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
129e0 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ction..** .** Th
129f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
12a00 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41  ver called in PA
12a10 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
12a20 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64   If it is called
12a30 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e  .** in PAGER_NON
12a40 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45  E or PAGER_SHARE
12a50 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  D state and the 
12a60 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73  lock held is les
12a70 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74  s.** exclusive t
12a80 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  han a RESERVED l
12a90 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  ock, it is a no-
12aa0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  op..**.** Otherw
12ab0 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20  ise, any active 
12ac0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72  savepoints are r
12ad0 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eleased..**.** I
12ae0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12af0 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e  le is open, then
12b00 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65   it is "finalize
12b10 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e  d". Once a journ
12b20 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20  al .** file has 
12b30 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69  been finalized i
12b40 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
12b50 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72  e to use it to r
12b60 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74  oll back a .** t
12b70 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20  ransaction. Nor 
12b80 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69  will it be consi
12b90 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f  dered to be a ho
12ba0 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69  t-journal by thi
12bb0 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65  s.** or any othe
12bc0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
12bd0 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68  ction. Exactly h
12be0 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ow a journal is 
12bf0 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70  finalized.** dep
12c00 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
12c10 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72  or not the pager
12c20 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
12c30 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12c40 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  d.** the current
12c50 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50   journal-mode (P
12c60 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
12c70 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c   value), as foll
12c80 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ows:.**.**   jou
12c90 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
12ca0 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
12cb0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12cc0 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64  is simply closed
12cd0 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20  . This destroys 
12ce0 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65  an .**     in-me
12cf0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  mory journal..**
12d00 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12d10 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  e==TRUNCATE.**  
12d20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
12d30 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  is truncated to 
12d40 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
12d50 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ze..**.**   jour
12d60 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12d70 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73  .**     The firs
12d80 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68  t 28 bytes of th
12d90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
12da0 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20  re zeroed. This 
12db0 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20  invalidates.**  
12dc0 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75     the first jou
12dd0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  rnal header in t
12de0 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e  he file, and hen
12df0 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  ce the entire jo
12e00 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
12e10 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f  e. An invalid jo
12e20 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f  urnal file canno
12e30 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
12e40 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12e50 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a  lMode==DELETE.**
12e60 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
12e70 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20   file is closed 
12e80 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e  and deleted usin
12e90 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
12ea0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  e()..**.**     I
12eb0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
12ec0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
12ed0 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d  ive mode, this m
12ee0 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a  ethod of finaliz
12ef0 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a  ing.**     the j
12f00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
12f10 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65  ever used. Inste
12f20 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ad, if the journ
12f30 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20  alMode is.**    
12f40 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
12f50 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
12f60 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
12f70 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
12f80 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f   under.**     jo
12f90 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
12fa0 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  ST is used inste
12fb0 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ad..**.** After 
12fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  the journal is f
12fd0 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61  inalized, the pa
12fe0 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47  ger moves to PAG
12ff0 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e  ER_READER state.
13000 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69  .** If running i
13010 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20  n non-exclusive 
13020 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74  rollback mode, t
13030 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  he lock on the f
13040 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67  ile is .** downg
13050 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45  raded to a SHARE
13060 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51  D_LOCK..**.** SQ
13070 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13080 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
13090 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
130a0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
130b0 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20  g.** any of the 
130c0 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  IO operations to
130d0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
130e0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e  urnal file or un
130f0 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  lock the.** data
13100 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f  base then the IO
13110 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
13120 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
13130 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  ser. If the .** 
13140 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e  operation to fin
13150 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13160 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68  l file fails, th
13170 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c  en the code stil
13180 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e  l.** tries to un
13190 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
131a0 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e  e file if not in
131b0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
131c0 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63   If the.** unloc
131d0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  k operation fail
131e0 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20  s as well, then 
131f0 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13200 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20  code related.** 
13210 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72  to the first err
13220 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28  or encountered (
13230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  the journal fina
13240 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73  lization one) is
13250 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
13260 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13270 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
13280 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
13290 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
132a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
132b0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
132c0 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
132d0 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
132e0 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
132f0 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13300 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13310 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13320 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
13330 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
13340 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
13350 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
13360 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
13370 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
13380 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
13390 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
133a0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
133b0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
133c0 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
133d0 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
133e0 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
133f0 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13400 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13410 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13420 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
13430 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
13440 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
13450 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
13460 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
13470 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
13480 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
13490 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
134a0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
134b0 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
134c0 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
134d0 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
134e0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
134f0 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13500 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13510 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13520 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
13530 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
13540 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
13550 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
13560 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
13570 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13580 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
13590 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
135a0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
135b0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
135c0 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
135d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
135e0 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
135f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13600 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13620 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13630 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
13640 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
13650 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
13660 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
13670 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
13680 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
13690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
136a0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
136b0 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
136c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
136d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
136e0 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
136f0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13700 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13710 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13720 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13730 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
13740 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
13750 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
13760 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
13770 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
13780 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
13790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
137a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
137b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
137c0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
137d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
137e0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
137f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13810 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13820 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13830 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13840 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13890 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
138a0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
138b0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
138c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
138d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
138e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
138f0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13900 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13910 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13920 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13940 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13950 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13960 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13970 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13980 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13990 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
139a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
139b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
139c0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
139d0 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
139e0 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
139f0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13a00 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13a10 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13a20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13a30 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13a40 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13a50 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13a60 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13a70 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13a80 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13a90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13aa0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13ab0 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13ac0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13ad0 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b00 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b10 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20  MODE_DELETE .   
13b20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
13b30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13b40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13b50 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
13b60 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
13b70 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13b80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
13b90 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
13ba0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13bb0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13bc0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
13bd0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
13be0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13bf0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
13c00 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
13c10 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
13c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13c30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
13c40 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73  _CHECK_PAGES.  s
13c50 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
13c60 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
13c70 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
13c80 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20  set_pagehash);. 
13c90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
13ca0 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ize==0 && sqlite
13cb0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
13cc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13cd0 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
13ce0 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  *p = pager_looku
13cf0 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  p(pPager, 1);.  
13d00 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
13d10 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30   p->pageHash = 0
13d20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
13d30 61 67 65 72 55 6e 72 65 66 28 70 29 3b 0a 20 20  agerUnref(p);.  
13d40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
13d50 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
13d60 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
13d70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
13d80 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
13d90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13da0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
13db0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
13dc0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
13dd0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
13de0 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
13df0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
13e00 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
13e10 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
13e20 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
13e30 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
13e40 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
13e50 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
13e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
13e70 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
13e80 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
13e90 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
13ea0 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
13eb0 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
13ec0 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
13ed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13ee0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
13ef0 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
13f00 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
13f10 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
13f20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
13f30 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
13f40 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
13f50 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13f60 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
13f70 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
13f80 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
13f90 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
13fa0 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
13fb0 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
13fc0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
13fd0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
13fe0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
13ff0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
14000 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
14010 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
14020 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
14030 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
14040 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
14050 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
14060 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
14070 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
14080 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14090 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
140a0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
140b0 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
140c0 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
140d0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
140e0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
140f0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
14100 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
14110 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
14120 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
14130 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
14140 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
14150 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14160 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
14170 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
14180 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
14190 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
141a0 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
141b0 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
141c0 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
141d0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
141e0 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
141f0 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
14200 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
14210 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
14220 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
14230 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
14240 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
14250 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
14260 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
14270 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
14280 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
14290 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
142a0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
142b0 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
142c0 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
142d0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
142e0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
142f0 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
14300 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
14310 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
14320 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
14330 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
14340 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
14350 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14360 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
14370 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
14380 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
14390 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
143a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
143b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
143c0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
143d0 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
143e0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
143f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14400 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
14410 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
14420 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14430 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
14440 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
14450 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
14460 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14470 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14480 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14490 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
144a0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
144b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
144c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
144d0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
144e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
144f0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
14500 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
14510 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14520 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
14530 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
14540 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
14550 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
14560 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
14570 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14580 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
14590 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
145a0 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
145b0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
145c0 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
145d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
145e0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
145f0 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
14600 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
14610 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
14630 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
14640 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
14650 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
14660 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
14670 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
14680 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14690 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
146a0 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
146b0 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
146c0 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
146d0 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
146e0 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
146f0 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
14700 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
14710 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
14720 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
14730 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
14740 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
14750 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
14760 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
14770 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
14780 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
14790 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
147a0 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
147b0 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
147c0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
147d0 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
147e0 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
147f0 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
14800 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14810 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
14820 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
14830 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
14840 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
14850 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
14860 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
14870 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
14880 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
14890 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
148a0 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
148b0 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
148c0 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
148d0 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
148e0 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
148f0 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
14900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
14910 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
14920 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
14930 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
14940 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
14950 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
14960 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
14970 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
14980 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
14990 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
149a0 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
149b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
149c0 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
149d0 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
149e0 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
149f0 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
14a00 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
14a10 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
14a20 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
14a30 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
14a40 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
14a50 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
14a60 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
14a70 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
14a80 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
14a90 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
14aa0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14ab0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
14ac0 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
14ad0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
14ae0 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
14af0 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
14b00 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
14b30 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
14b40 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
14b50 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
14b60 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
14b70 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
14b80 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
14b90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
14ba0 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
14bb0 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
14bc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
14bd0 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
14be0 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
14bf0 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
14c00 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
14c10 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
14c20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
14c30 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
14c40 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
14c50 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
14c60 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
14c70 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
14c80 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
14c90 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
14ca0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
14cb0 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
14cc0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
14cd0 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
14ce0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
14cf0 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
14d00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14d10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
14d20 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
14d30 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
14d40 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
14d50 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
14d60 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14d70 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
14d80 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
14d90 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
14da0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
14db0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
14dc0 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
14dd0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
14de0 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
14df0 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
14e00 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
14e10 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
14e20 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
14e30 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
14e40 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
14e50 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
14e60 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
14e70 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
14e80 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
14e90 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
14ea0 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
14eb0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
14ec0 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
14ed0 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
14ee0 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
14ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
14f00 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
14f10 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
14f20 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14f30 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
14f40 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
14f50 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
14f60 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
14f70 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
14f80 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
14f90 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
14fa0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
14fb0 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
14fc0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
14fd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14fe0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
14ff0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
15000 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
15010 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
15020 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
15030 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15040 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
15050 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
15060 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
15070 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
15080 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
15090 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
150a0 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
150b0 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
150c0 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
150d0 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
150e0 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
150f0 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
15100 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
15110 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
15120 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
15130 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
15140 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
15150 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
15160 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
15170 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
15180 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
15190 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
151a0 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
151b0 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
151c0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
151d0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
151e0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
151f0 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
15200 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
15210 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
15220 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
15230 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
15240 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
15250 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
15260 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
15270 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
15280 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15290 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
152a0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
152b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
152d0 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
152e0 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
152f0 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15310 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
15320 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
15330 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
15340 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15350 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
15360 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
15370 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
15380 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
15390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
153a0 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
153b0 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
153c0 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
153d0 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
153e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
153f0 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
15400 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
15410 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
15420 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
15430 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
15440 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
15450 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
15460 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
15470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15480 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15490 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
154a0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
154b0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
154c0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
154d0 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
154e0 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
154f0 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15510 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
15520 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
15530 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
15540 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
15550 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
15560 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
15570 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
15580 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
15590 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
155a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
155b0 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
155c0 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
155d0 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
155e0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
155f0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
15600 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15610 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
15620 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
15630 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
15640 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
15650 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
15660 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
15670 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
15680 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
15690 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
156a0 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
156b0 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
156c0 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
156d0 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
156e0 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
156f0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15700 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
15710 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
15720 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
15730 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
15740 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
15750 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
15760 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
15770 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
15780 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
15790 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
157a0 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
157b0 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
157c0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
157d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
157e0 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
157f0 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
15800 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
15810 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
15820 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
15830 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15840 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
15850 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15860 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
15870 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
15880 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
15890 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
158a0 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
158b0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
158c0 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
158d0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
158e0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
158f0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
15900 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15910 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15920 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
15930 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
15940 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
15950 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
15960 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
15970 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
15980 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
15990 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
159a0 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
159b0 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
159c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
159d0 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
159e0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
159f0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
15a00 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
15a10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
15a20 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
15a30 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15a40 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
15a50 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
15a60 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
15a70 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
15a80 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
15a90 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
15aa0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15ab0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15ac0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
15ad0 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
15ae0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
15af0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
15b00 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
15b10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
15b30 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
15b40 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
15b50 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
15b60 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
15b70 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
15b80 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
15b90 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
15ba0 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
15bb0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
15bc0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
15bd0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
15be0 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
15bf0 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
15c00 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
15c10 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
15c20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
15c30 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
15c40 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
15c50 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
15c60 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
15c70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
15c80 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
15c90 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
15ca0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
15cb0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
15cc0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
15cd0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
15ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
15cf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
15d00 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
15d10 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
15d20 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
15d30 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
15d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15d50 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
15d60 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
15d70 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
15d80 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
15d90 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
15da0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15db0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
15dc0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
15dd0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
15de0 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
15df0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15e00 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
15e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15e20 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
15e30 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
15e40 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
15e50 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
15e60 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
15e70 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
15e80 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
15e90 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
15ea0 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
15eb0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
15ec0 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
15ed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15ee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
15ef0 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
15f00 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
15f10 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
15f20 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
15f30 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
15f40 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
15f50 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
15f60 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
15f70 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
15f80 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
15f90 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
15fa0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
15fb0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
15fc0 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
15fd0 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
15fe0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
15ff0 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
16000 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
16010 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
16020 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
16030 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
16040 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
16050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16060 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
16070 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
16080 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
16090 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
160a0 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
160b0 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
160c0 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
160d0 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
160e0 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
160f0 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
16100 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
16110 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16120 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
16130 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16140 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
16150 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
16160 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
16170 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
16180 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
16190 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
161a0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
161b0 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
161c0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
161d0 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
161e0 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
161f0 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
16200 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
16210 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
16220 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
16230 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
16240 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
16250 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
16260 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
16270 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
16280 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
16290 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
162a0 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
162b0 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
162c0 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
162d0 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
162e0 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
162f0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16300 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
16310 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
16320 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
16330 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
16340 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
16350 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
16360 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
16370 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
16380 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
16390 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
163a0 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
163b0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
163c0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
163d0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
163e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
163f0 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
16400 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
16410 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
16420 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
16430 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
16440 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
16450 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
16460 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
16470 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
16480 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
16490 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
164a0 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
164b0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
164c0 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
164d0 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
164e0 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
164f0 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
16500 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
16510 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
16520 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
16530 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
16540 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
16550 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
16560 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16570 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
16580 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
16590 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
165a0 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
165b0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
165c0 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
165d0 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
165e0 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
165f0 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
16600 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
16610 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
16620 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
16630 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
16640 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
16650 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
16660 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
16670 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
16680 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
16690 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
166a0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
166b0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
166c0 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
166d0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
166e0 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
166f0 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
16700 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
16710 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
16720 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
16730 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
16740 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
16750 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
16760 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
16770 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
16780 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
16790 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
167a0 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
167b0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
167c0 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
167d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
167e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
167f0 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
16800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
16810 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
16820 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
16830 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
16840 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
16850 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16860 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
16870 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
16880 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
16890 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
168a0 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
168b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
168c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
168d0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
168e0 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
168f0 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
16900 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
16910 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
16920 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
16930 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
16940 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
16950 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
16960 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
16970 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
16980 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
16990 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
169a0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
169b0 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
169c0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
169d0 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
169e0 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
169f0 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
16a00 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
16a10 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
16a20 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
16a30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
16a40 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
16a50 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
16a60 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
16a70 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
16a80 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
16a90 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
16aa0 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
16ab0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
16ac0 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
16ad0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
16ae0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16af0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
16b00 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
16b10 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61  er->fd, (u8*)aDa
16b20 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
16b30 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
16b40 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
16b50 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
16b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
16b70 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
16b80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16b90 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
16ba0 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  {.      CODEC1(p
16bb0 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
16bc0 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
16bd0 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73  _NOMEM);.      s
16be0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
16bf0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
16c00 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
16c10 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44  Data);.      COD
16c20 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
16c30 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
16c40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61  QLITE_NOMEM, aDa
16c50 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ta);.    }.  }el
16c60 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72  se if( !isMainJr
16c70 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a  nl && pPg==0 ){.
16c80 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
16c90 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  s a rollback of 
16ca0 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  a savepoint and 
16cb0 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69  data was not wri
16cc0 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74  tten to.    ** t
16cd0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
16ce0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
16cf0 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65  in-memory, there
16d00 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a   is a potential.
16d10 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20      ** problem. 
16d20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  When the page is
16d30 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79   next fetched by
16d40 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
16d50 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  r, it .    ** wi
16d60 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
16d70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16d80 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  e, which may or 
16d90 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  may not be .    
16da0 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20  ** current. .   
16db0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65   **.    ** There
16dc0 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66   are a couple of
16dd0 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20   different ways 
16de0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e  this can happen.
16df0 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20   All are quite. 
16e00 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57     ** obscure. W
16e10 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73  hen running in s
16e20 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
16e30 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   this can only h
16e40 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66  appen .    ** if
16e50 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20   the page is on 
16e60 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74  the free-list at
16e70 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16e80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
16e90 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  hen.    ** popul
16ea0 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64  ated, then moved
16eb0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
16ec0 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20  gerMovepage().. 
16ed0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
16ee0 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
16ef0 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  add an in-memory
16f00 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63   page to the cac
16f10 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  he containing.  
16f20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75    ** the data ju
16f30 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  st read from the
16f40 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61   sub-journal. Ma
16f50 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
16f60 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64  irty .    ** and
16f70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65   if the pager re
16f80 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c  quires a journal
16f90 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b  -sync, then mark
16fa0 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20   the page as .  
16fb0 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61    ** requiring a
16fc0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65   journal-sync be
16fd0 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74  fore it is writt
16fe0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
16ff0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
17000 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17010 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
17020 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ll==0 );.    pPa
17030 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b  ger->doNotSpill+
17040 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  +;.    rc = sqli
17050 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
17060 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
17070 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
17080 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
17090 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  tSpill==1 );.   
170a0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
170b0 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72  ill--;.    if( r
170c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
170d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
170e0 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
170f0 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
17100 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
17110 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
17120 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
17130 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
17140 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
17150 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
17160 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
17170 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
17180 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
17190 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
171a0 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
171b0 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
171c0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
171d0 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
171e0 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
171f0 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
17200 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
17210 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
17220 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
17230 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
17240 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
17250 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
17260 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
17270 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
17280 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
17290 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
172a0 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75  memcpy(pData, (u
172b0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
172c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
172d0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
172e0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  er(pPg);.    if(
172f0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28   isMainJrnl && (
17300 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70  !isSavepnt || *p
17310 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e  Offset<=pPager->
17320 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
17330 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
17340 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
17350 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
17360 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
17370 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
17380 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17390 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
173a0 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
173b0 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
173c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
173d0 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
173e0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
173f0 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
17400 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
17410 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
17420 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
17430 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
17440 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20  t out to the.   
17450 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
17460 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17470 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  * There is one e
17480 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
17490 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61   rule. If the pa
174a0 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  ge is being roll
174b0 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
174c0 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61   as part of a sa
174d0 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74  vepoint (or stat
174e0 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20  ement) rollback 
174f0 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a  from an .      *
17500 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  * unsynced porti
17510 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  on of the main j
17520 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
17530 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  n it is not safe
17540 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72  .      ** to mar
17550 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
17560 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63  ean. This is bec
17570 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65  ause marking the
17580 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a   page as.      *
17590 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65  * clean will cle
175a0 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
175b0 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e  D_SYNC flag. Sin
175c0 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  ce the page is. 
175d0 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
175e0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
175f0 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e  ile (recorded in
17600 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
17610 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  l) and.      ** 
17620 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
17630 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61  YNC flag is clea
17640 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65  red, if the page
17650 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
17660 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
17670 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
17680 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ction, it will b
17690 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
176a0 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  y but.      ** t
176b0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
176c0 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74  NC flag will not
176d0 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c   be set. It coul
176e0 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c  d then potential
176f0 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77  ly.      ** be w
17700 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20  ritten out into 
17710 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17720 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75  e before its jou
17730 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
17740 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79  ** segment is sy
17750 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68  nced. If a crash
17760 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f   occurs during o
17770 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  r following this
17780 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  ,.      ** datab
17790 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  ase corruption m
177a0 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20  ay ensue..      
177b0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
177c0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
177d0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73  ager) );.      s
177e0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
177f0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
17800 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
17810 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a  pagehash(pPg);..
17820 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
17830 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
17840 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
17850 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
17860 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
17870 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
17880 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
17890 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
178a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
178b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
178c0 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
178d0 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
178e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
178f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17900 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
17910 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
17920 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
17930 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
17940 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
17950 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
17960 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
17970 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
17980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
179a0 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
179b0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
179c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
179d0 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
179e0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
179f0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
17a00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17a10 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
17a20 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
17a30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17a40 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
17a50 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
17a60 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
17a70 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
17a80 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
17a90 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
17aa0 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
17ab0 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
17ac0 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
17ad0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
17ae0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
17af0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
17b00 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
17b10 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
17b20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
17b30 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
17b40 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
17b50 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
17b60 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
17b70 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
17b80 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
17b90 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
17ba0 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
17bb0 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
17bc0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
17bd0 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
17be0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
17bf0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
17c00 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
17c10 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
17c20 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
17c30 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
17c40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
17c50 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
17c60 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
17c70 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
17c80 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
17c90 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
17ca0 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
17cb0 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
17cc0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
17cd0 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
17ce0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
17cf0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
17d00 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
17d10 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
17d20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
17d30 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
17d40 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
17d50 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
17d60 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
17d70 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
17d80 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
17d90 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
17da0 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
17db0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
17dc0 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
17dd0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
17de0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
17df0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
17e00 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
17e10 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
17e20 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
17e30 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
17e40 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
17e50 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
17e60 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
17e70 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
17e80 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
17e90 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
17ea0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
17eb0 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
17ec0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
17ed0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
17ee0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
17ef0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
17f00 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
17f10 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
17f20 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
17f30 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
17f40 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
17f50 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
17f60 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
17f70 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
17f80 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
17f90 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
17fa0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
17fb0 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
17fc0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
17fd0 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
17fe0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
17ff0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
18000 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18010 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
18020 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
18030 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18040 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18050 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18060 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18070 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18080 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18090 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
180a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
180b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
180c0 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
180d0 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
180e0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
180f0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18100 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18110 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18130 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18140 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18150 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18160 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18170 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18180 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
181b0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
181c0 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
181d0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
181e0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
181f0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18200 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18210 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18220 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
18230 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18240 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
18250 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
18260 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
18270 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
18280 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
18290 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
182a0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
182b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
182c0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
182d0 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
182e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
182f0 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
18300 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
18310 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
18320 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
18330 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
18340 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
18350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18360 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
18370 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18380 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
18390 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
183a0 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
183b0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
183c0 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
183d0 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
183e0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
183f0 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
18400 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
18410 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18420 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
18430 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
18440 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
18450 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
18460 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
18470 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
18480 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
18490 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
184a0 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
184b0 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
184c0 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
184d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
184e0 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
184f0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
18500 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
18510 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
18520 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
18530 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
18540 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
18550 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
18560 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
18570 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
18580 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18590 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
185a0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
185b0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
185c0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
185d0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
185e0 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
185f0 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
18600 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
18610 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
18620 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
18630 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
18640 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
18650 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
18660 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
18670 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
18680 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
18690 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
186a0 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
186b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
186c0 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
186d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
186e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
186f0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18700 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
18710 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
18720 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
18730 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
18740 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
18750 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
18760 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
18770 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
18780 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
18790 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
187a0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
187b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
187c0 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
187d0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
187e0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
187f0 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
18800 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
18810 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
18820 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
18830 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
18840 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18850 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18860 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
18870 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
18880 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
18890 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
188a0 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
188b0 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
188c0 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
188d0 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
188e0 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
188f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
18900 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
18910 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
18920 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
18930 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
18940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18950 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18960 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
18970 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
18980 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
18990 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
189a0 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
189b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
189c0 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
189d0 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
189e0 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
189f0 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
18a00 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
18a10 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
18a20 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
18a30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18a40 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
18a50 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
18a60 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
18a70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18a80 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
18a90 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
18aa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18ab0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18ac0 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
18ad0 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
18ae0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18af0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18b00 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18b10 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
18b20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
18b30 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
18b40 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
18b50 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
18b60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
18b70 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
18b80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18b90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18ba0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18bb0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
18bc0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
18bd0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
18be0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
18bf0 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
18c00 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
18c10 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
18c20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
18c30 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
18c40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
18c50 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18c60 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18c70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
18c80 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
18c90 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
18ca0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
18cb0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18cc0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
18cd0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
18ce0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
18cf0 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
18d00 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
18d10 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
18d20 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
18d30 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
18d40 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
18d50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
18d60 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
18d70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
18d80 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
18d90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18da0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
18db0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
18dc0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
18dd0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
18de0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
18df0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
18e00 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
18e10 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
18e20 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
18e30 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
18e40 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
18e50 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
18e60 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
18e70 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
18e80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
18e90 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
18ea0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
18eb0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
18ec0 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
18ed0 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
18ee0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
18ef0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
18f00 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
18f10 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
18f20 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
18f30 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
18f40 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
18f50 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
18f60 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
18f70 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
18f80 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
18f90 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
18fa0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
18fb0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
18fc0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
18fd0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
18fe0 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
18ff0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
19000 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
19010 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
19020 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
19030 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
19040 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
19050 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
19060 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
19070 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
19080 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
19090 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
190a0 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
190b0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
190c0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
190d0 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
190e0 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
190f0 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
19100 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
19110 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
19120 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
19130 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
19140 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
19150 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
19160 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
19170 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
19180 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
19190 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
191a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
191b0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
191c0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
191d0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
191e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
191f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19200 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
19210 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
19220 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19230 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
19240 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
19250 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
19260 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
19270 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
19280 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
19290 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
192a0 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
192b0 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
192c0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
192d0 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
192e0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
192f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19300 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19310 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
19320 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
19330 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
19340 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
19350 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
19360 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
19370 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
19380 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
19390 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
193a0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
193b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
193c0 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
193d0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
193e0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
193f0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19410 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
19420 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
19430 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19440 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50  (currentSize+szP
19450 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b  age)<=newSize ){
19460 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
19470 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
19480 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
19490 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
194a0 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
194b0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
194c0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
194d0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
194e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
194f0 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
19500 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
19510 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
19520 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
19530 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
19540 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
19550 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
19560 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19580 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
19590 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
195a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
195b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
195c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
195d0 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72   a sanitized ver
195e0 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74  sion of the sect
195f0 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69  or-size of OS fi
19600 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a  le pFile. The.**
19610 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
19620 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
19630 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e  ie between 32 an
19640 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  d MAX_SECTOR_SIZ
19650 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
19660 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  3SectorSize(sqli
19670 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
19680 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73  {.  int iRet = s
19690 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
196a0 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ze(pFile);.  if(
196b0 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20   iRet<32 ){.    
196c0 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65  iRet = 512;.  }e
196d0 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58  lse if( iRet>MAX
196e0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
196f0 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
19700 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
19710 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d   );.    iRet = M
19720 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
19730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
19740 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
19750 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
19760 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
19770 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
19780 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
19790 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
197a0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
197b0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
197c0 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
197d0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
197e0 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
197f0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
19800 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  ed used .** to d
19810 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
19820 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
19830 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
19840 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
19850 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
19860 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
19870 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
19880 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
19890 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
198a0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
198b0 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
198c0 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
198d0 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
198e0 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
198f0 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
19900 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
19910 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
19920 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
19930 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
19940 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
19950 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
19960 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
19970 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
19980 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
19990 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
199a0 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
199b0 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20  TOR_SIZE..**.** 
199c0 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  If the file has 
199d0 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
199e0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
199f0 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74  RITE property, t
19a00 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65  hen set.** the e
19a10 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
19a20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  size to its mini
19a30 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e  mum value (512).
19a40 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
19a50 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74  .** pPager->sect
19a60 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66  orSize is to def
19a70 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72  ine the "blast r
19a80 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20  adius" of bytes 
19a90 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
19aa0 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20  ange if a crash 
19ab0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
19ac0 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ting to a single
19ad0 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74   byte in.** that
19ae0 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74   range.  But wit
19af0 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  h POWERSAFE_OVER
19b00 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74  WRITE, the blast
19b10 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a   radius is zero.
19b20 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74  ** (that is what
19b30 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
19b40 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20  RITE means), so 
19b50 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  we minimize the 
19b60 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20  sector.** size. 
19b70 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
19b80 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20  ompatibility of 
19b90 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
19ba0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
19bb0 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72  ,.** we cannot r
19bc0 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
19bd0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
19be0 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74  below 512..*/.st
19bf0 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
19c00 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
19c10 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
19c20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
19c30 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
19c40 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
19c50 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
19c60 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  ile.   || (sqlit
19c70 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
19c80 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
19c90 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20  ->fd) & .       
19ca0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
19cb0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
19cc0 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b  ERWRITE)!=0.  ){
19cd0 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
19ce0 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
19cf0 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
19d00 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
19d10 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
19d20 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
19d30 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
19d40 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
19d50 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
19d60 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
19d70 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70  gfault. */.    p
19d80 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
19d90 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  e = 512;.  }else
19da0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
19db0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
19dc0 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  e3SectorSize(pPa
19dd0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a  ger->fd);.  }.}.
19de0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
19df0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
19e00 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
19e10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
19e20 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
19e30 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
19e40 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
19e50 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
19e60 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
19e70 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
19e80 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
19e90 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
19ea0 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
19eb0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
19ec0 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
19ed0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
19ee0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
19ef0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
19f00 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
19f10 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
19f20 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
19f30 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
19f40 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
19f50 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
19f60 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
19f70 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
19f80 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
19f90 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
19fa0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
19fb0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
19fc0 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
19fd0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
19fe0 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
19ff0 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
1a000 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a010 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1a020 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
1a030 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
1a040 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
1a050 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
1a060 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
1a070 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1a080 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
1a090 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
1a0a0 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
1a0b0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1a0c0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
1a0d0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1a0e0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1a0f0 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73  ch is the page s
1a100 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65  ize..**  (7)  ze
1a110 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74  ro padding out t
1a120 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
1a130 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20  r size..**  (8) 
1a140 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
1a150 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
1a160 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
1a170 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1a180 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
1a190 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
1a1a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1a1b0 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
1a1c0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1a1d0 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
1a1e0 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
1a1f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1a200 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
1a210 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20  e first 7 items 
1a220 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
1a230 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
1a240 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
1a250 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74  ce of the 8th it
1a260 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
1a270 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
1a280 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
1a290 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
1a2a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
1a2b0 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
1a2c0 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
1a2d0 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
1a2e0 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
1a2f0 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
1a300 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
1a310 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1a320 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
1a330 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
1a340 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
1a350 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
1a360 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
1a370 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
1a380 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
1a390 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
1a3a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a3b0 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
1a3c0 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
1a3d0 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
1a3e0 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
1a3f0 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
1a400 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
1a410 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
1a420 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
1a430 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
1a440 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
1a450 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
1a460 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
1a470 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
1a480 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1a490 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1a4a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
1a4b0 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1a4c0 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
1a4d0 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
1a4e0 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
1a4f0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1a500 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
1a510 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
1a520 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
1a530 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
1a540 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
1a550 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
1a560 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
1a570 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
1a580 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
1a590 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
1a5a0 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
1a5b0 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
1a5c0 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
1a5d0 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
1a5e0 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
1a5f0 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
1a600 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
1a610 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
1a620 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
1a630 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
1a640 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1a650 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
1a660 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
1a670 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
1a680 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
1a690 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
1a6a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1a6b0 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
1a6c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
1a6d0 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
1a6e0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1a6f0 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
1a700 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
1a710 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
1a720 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
1a730 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
1a740 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
1a750 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
1a760 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
1a770 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
1a780 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1a790 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
1a7a0 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
1a7b0 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
1a7c0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
1a7d0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
1a7e0 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
1a7f0 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
1a800 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
1a810 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
1a820 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
1a830 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
1a840 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
1a850 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
1a860 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
1a870 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1a880 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
1a890 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
1a8a0 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
1a8b0 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
1a8c0 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
1a8d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
1a8e0 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
1a8f0 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
1a900 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
1a910 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
1a920 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1a930 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
1a940 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1a950 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1a960 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a980 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
1a990 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
1a9a0 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
1a9b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1a9c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1a9d0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
1a9e0 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
1a9f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aa00 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1aa10 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1aa20 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
1aa30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1aa40 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
1aa50 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
1aa60 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa80 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
1aa90 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
1aaa0 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1aac0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1aad0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1aae0 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
1aaf0 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
1ab00 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
1ab10 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1ab20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
1ab30 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
1ab40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1ab50 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
1ab60 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
1ab70 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a  ollback */..  /*
1ab80 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1ab90 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
1aba0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1abb0 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
1abc0 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
1abd0 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
1abe0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1abf0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1ac00 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ac10 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1ac20 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
1ac30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ac40 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
1ac50 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1ac60 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1ac70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
1ac80 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
1ac90 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
1aca0 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
1acb0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1acc0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
1acd0 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
1ace0 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
1acf0 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
1ad00 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
1ad10 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
1ad20 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
1ad30 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
1ad40 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
1ad50 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
1ad60 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
1ad70 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
1ad80 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
1ad90 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
1ada0 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
1adb0 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
1adc0 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
1add0 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
1ade0 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
1adf0 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
1ae00 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1ae10 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
1ae20 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78  unix.c,.  **  mx
1ae30 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
1ae40 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
1ae50 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
1ae60 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
1ae70 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
1ae80 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
1ae90 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1aea0 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
1aeb0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1aec0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1aed0 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1aee0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1aef0 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
1af00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1af10 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
1af20 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1af30 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
1af40 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1af50 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
1af60 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
1af70 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1af80 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
1af90 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1afa0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
1afb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1afc0 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65   = 0;.  needPage
1afd0 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a  rReset = isHot;.
1afe0 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
1aff0 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
1b000 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75  r when a readJou
1b010 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20  rnalHdr() or .  
1b020 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
1b030 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c  k_one_page() cal
1b040 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
1b050 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
1b060 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72  rror .  ** occur
1b070 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  s. .  */.  while
1b080 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ( 1 ){.    /* Re
1b090 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
1b0a0 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
1b0b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b0c0 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
1b0d0 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
1b0e0 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
1b0f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b100 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
1b110 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
1b120 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
1b130 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
1b140 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  s must have fail
1b150 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
1b160 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
1b170 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
1b180 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
1b190 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1b1a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1b1b0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
1b1c0 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
1b1d0 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
1b1e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b1f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
1b200 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b210 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1b220 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b240 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b250 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1b260 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
1b270 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
1b280 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
1b290 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1b2a0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
1b2b0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
1b2c0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
1b2d0 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
1b2e0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
1b2f0 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
1b300 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
1b310 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
1b320 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
1b330 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
1b340 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
1b350 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
1b360 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
1b370 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
1b380 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
1b390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b3a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1b3b0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1b3c0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
1b3d0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1b3e0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
1b3f0 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
1b400 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1b410 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1b420 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
1b430 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
1b440 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1b450 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
1b460 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
1b470 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
1b480 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
1b490 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
1b4a0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
1b4b0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
1b4c0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
1b4d0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
1b4e0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
1b4f0 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
1b500 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1b510 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
1b520 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
1b530 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
1b540 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
1b550 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
1b560 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1b570 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
1b580 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
1b590 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
1b5a0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
1b5b0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
1b5c0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
1b5d0 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
1b5e0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
1b5f0 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
1b600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
1b610 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
1b620 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1b630 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
1b640 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
1b650 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
1b660 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
1b670 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
1b680 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
1b690 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
1b6a0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
1b6b0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
1b6c0 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
1b6d0 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
1b6e0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b6f0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
1b700 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
1b710 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1b720 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
1b730 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1b740 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
1b750 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
1b760 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
1b770 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1b780 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
1b790 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
1b7a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b7b0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
1b7c0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1b7d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b7e0 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
1b7f0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1b800 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1b810 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1b820 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
1b830 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
1b840 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
1b850 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1b860 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
1b870 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
1b880 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
1b890 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1b8a0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1b8b0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
1b8c0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
1b8d0 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
1b8e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b8f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b900 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1b910 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
1b920 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1b930 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
1b940 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
1b950 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
1b960 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
1b970 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
1b980 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
1b990 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
1b9a0 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
1b9b0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
1b9c0 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
1b9d0 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
1b9e0 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
1b9f0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1ba00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1ba10 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
1ba20 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1ba30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1ba40 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
1ba50 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
1ba60 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
1ba70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ba80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ba90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1baa0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1bab0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bac0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1bad0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1bae0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1baf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1bb00 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1bb10 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1bb20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1bb30 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1bb40 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1bb50 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1bb60 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1bb70 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1bb80 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1bb90 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1bba0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1bbb0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1bbc0 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1bbd0 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1bbe0 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1bbf0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1bc00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1bc10 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1bc20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1bc30 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1bc40 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1bc50 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1bc60 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1bc70 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1bc80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bc90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1bca0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1bcb0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1bcc0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1bcd0 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1bce0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1bcf0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1bd00 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1bd10 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1bd20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1bd30 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1bd40 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1bd50 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1bd60 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1bd70 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1bd80 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1bd90 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1bda0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1bdb0 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1bdc0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1bdd0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1bde0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1bdf0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1be00 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1be10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1be20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1be30 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1be40 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1be50 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1be60 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1be70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1be80 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1be90 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1bea0 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1beb0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1bec0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1bed0 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1bee0 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1bef0 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1bf00 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1bf10 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1bf20 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1bf30 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1bf40 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1bf50 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1bf60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1bf70 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1bf80 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1bf90 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1bfa0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1bfb0 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1bfc0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1bfd0 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1bfe0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1bff0 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1c000 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1c010 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1c020 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1c030 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1c040 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1c050 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1c060 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1c070 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1c080 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1c090 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1c0a0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1c0b0 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1c0c0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1c0d0 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1c0e0 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1c0f0 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1c100 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1c110 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1c120 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1c130 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1c140 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1c150 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1c160 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1c170 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1c180 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1c190 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1c1a0 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1c1b0 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1c1c0 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1c1d0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1c1e0 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1c1f0 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1c200 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1c210 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1c220 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1c230 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1c240 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1c250 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1c260 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1c280 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1c290 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1c2a0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1c2b0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1c2c0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1c2d0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1c2e0 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1c2f0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1c300 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1c310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1c320 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1c330 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1c340 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1c350 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1c360 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1c370 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c380 72 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0a 20  rSync(pPager);. 
1c390 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1c3a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c3b0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1c3c0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
1c3d0 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
1c3e0 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ');.    testcase
1c3f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c400 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c410 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1c420 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
1c430 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1c440 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
1c450 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
1c460 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1c470 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
1c480 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
1c490 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
1c4a0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
1c4b0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
1c4c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
1c4d0 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
1c4e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
1c4f0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1c500 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
1c510 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1c520 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1c530 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1c540 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1c550 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1c560 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1c570 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1c580 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1c590 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1c5a0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1c5b0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1c5c0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1c5d0 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1c5e0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1c5f0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1c600 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1c610 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1c620 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1c630 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1c640 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
1c650 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1c660 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1c670 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1c680 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1c690 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1c6a0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1c6b0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1c6c0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1c6d0 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1c6e0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1c6f0 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1c700 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1c710 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1c720 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1c730 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1c740 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1c750 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1c760 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1c770 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1c780 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1c790 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1c7a0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1c7b0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
1c7c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1c7d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c7e0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1c7f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1c800 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
1c810 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
1c820 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
1c830 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
1c840 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ad */.  int rc =
1c850 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1c860 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c870 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ode */.  int isI
1c880 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nWal = 0;       
1c890 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1c8a0 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20   page is in log 
1c8b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  file */.  int pg
1c8c0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
1c8d0 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
1c8e0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1c8f0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
1c900 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1c910 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1c920 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1c930 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1c940 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28  r->fd) );..  if(
1c950 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70   NEVER(!isOpen(p
1c960 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20  Pager->fd)) ){. 
1c970 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c980 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1c990 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
1c9a0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
1c9b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1c9c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c9d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  ;.  }..  if( pag
1c9e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1c9f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74   ){.    /* Try t
1ca00 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20  o pull the page 
1ca10 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61  from the write-a
1ca20 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20  head log. */.   
1ca30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1ca40 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61  Read(pPager->pWa
1ca50 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61  l, pgno, &isInWa
1ca60 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44  l, pgsz, pPg->pD
1ca70 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ata);.  }.  if( 
1ca80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ca90 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20   !isInWal ){.   
1caa0 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1cab0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1cac0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1cad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1cae0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1caf0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1cb00 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1cb10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cb20 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1cb30 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1cb40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1cb50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1cb60 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1cb70 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1cb80 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1cb90 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1cba0 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1cbb0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1cbc0 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1cbd0 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1cbe0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1cbf0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1cc00 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1cc10 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1cc20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1cc30 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1cc40 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1cc50 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1cc60 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1cc70 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1cc80 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1cc90 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1cca0 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1ccb0 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1ccc0 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1ccd0 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1cce0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1ccf0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1cd00 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1cd10 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1cd20 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1cd30 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1cd40 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1cd50 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1cd60 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1cd70 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1cd80 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1cd90 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1cda0 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1cdb0 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1cdc0 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1cdd0 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67  noising equaling
1cde0 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1cdf0 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1ce00 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1ce10 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1ce20 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1ce30 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1ce40 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ce50 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1ce60 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1ce70 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1ce80 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1ce90 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1cea0 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1ceb0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1cec0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1ced0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1cee0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1cef0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1cf00 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1cf10 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1cf20 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  a, pgno, 3, rc =
1cf30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
1cf40 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1cf50 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1cf60 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1cf70 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1cf80 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1cf90 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1cfa0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1cfb0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1cfc0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1cfd0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1cfe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cff0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d000 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1d010 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1d020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d030 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1d040 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1d050 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1d060 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1d070 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1d080 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1d090 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d0a0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1d0b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1d0c0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1d0d0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1d0e0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1d0f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1d100 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1d110 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1d120 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1d130 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1d140 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1d150 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1d160 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1d170 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1d180 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1d190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d1a0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1d1b0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1d1c0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1d1d0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1d1e0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1d1f0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1d200 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1d210 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1d220 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1d230 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1d240 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1d250 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d260 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1d270 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1d280 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1d290 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1d2a0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1d2b0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1d2c0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1d2d0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1d2e0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1d2f0 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1d300 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1d310 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1d320 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1d330 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1d340 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d350 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1d360 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1d370 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1d380 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1d390 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1d3a0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1d3b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d3c0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1d3d0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1d3e0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1d3f0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1d400 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1d410 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1d420 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1d430 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1d440 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1d450 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1d460 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1d470 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1d480 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1d490 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1d4a0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1d4b0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1d4c0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1d4d0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1d4e0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1d4f0 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1d500 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1d510 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1d520 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1d530 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1d540 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1d550 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1d560 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1d570 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1d580 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1d590 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1d5a0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1d5b0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1d5c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d5d0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1d5e0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1d5f0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1d600 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1d610 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1d620 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1d630 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1d640 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1d650 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1d660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1d670 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1d680 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1d690 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
1d6a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1d6b0 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1d6c0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1d6d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1d6e0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1d6f0 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1d700 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1d710 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1d720 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1d730 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
1d740 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d760 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1d770 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
1d780 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d790 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1d7a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d7b0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1d7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1d7d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1d7e0 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1d7f0 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1d800 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1d810 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1d820 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1d830 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1d840 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1d850 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1d860 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1d870 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1d880 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1d890 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1d8a0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1d8b0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1d8c0 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1d8d0 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1d8e0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1d8f0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1d900 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1d910 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1d920 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1d930 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1d940 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1d950 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1d960 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1d970 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1d980 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1d990 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1d9a0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1d9b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d9c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d9d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1d9e0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1d9f0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1da00 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1da10 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1da20 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1da30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1da40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da60 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1da70 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1daa0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1dab0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1dac0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1dad0 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1dae0 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1daf0 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1db00 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1db10 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1db20 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1db30 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1db40 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1db50 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1db60 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1db70 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1db80 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1db90 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1dba0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1dbb0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1dbc0 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1dbd0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1dbe0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1dbf0 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1dc00 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1dc10 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1dc20 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1dc30 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1dc40 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1dc50 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1dc60 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1dc70 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1dc80 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1dc90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1dca0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1dcb0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1dcc0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1dcd0 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1dce0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1dcf0 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1dd00 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1dd10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1dd20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1dd30 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1dd40 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1dd50 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1dd60 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1dd70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1dd80 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1dd90 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1dda0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1ddb0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1ddc0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1ddd0 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1dde0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1ddf0 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1de00 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1de10 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1de20 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1de30 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1de40 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1de50 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1de60 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1de70 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1de80 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1de90 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1dea0 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1deb0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1dec0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1ded0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1df00 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1df10 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1df20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1df30 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1df40 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1df50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1df60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1df70 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1df80 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1df90 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1dfa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1dfb0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1dfc0 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1dfd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dff0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e000 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e030 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1e040 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1e050 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1e060 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48  efined(SQLITE_CH
1e070 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48  ECK_PAGES).  PgH
1e080 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e0a0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1e0b0 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66   pages */.#endif
1e0c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1e0d0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1e0e0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1e0f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1e100 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1e110 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1e120 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1e130 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1e140 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1e150 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1e160 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1e170 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1e180 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1e190 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1e1a0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1e1b0 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1e1c0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1e1d0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1e1e0 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1e1f0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1e200 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1e210 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1e220 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1e230 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1e240 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1e250 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1e260 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1e270 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1e280 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1e290 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1e2a0 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1e2b0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1e2c0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1e2d0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1e2e0 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  p;.    PgHdr **p
1e2f0 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1e300 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
1e310 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1e320 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1e330 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e340 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1e350 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1e360 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1e370 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1e380 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1e390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e3a0 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1e3b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1e3c0 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1e3d0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1e3e0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1e3f0 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1e400 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1e410 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1e420 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1e430 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1e440 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1e450 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1e460 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e470 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1e480 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1e490 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1e4a0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1e4b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1e4c0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1e4d0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1e4e0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1e4f0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1e500 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1e510 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1e520 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1e530 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1e540 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1e550 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e560 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1e570 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1e580 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1e590 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1e5a0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1e5b0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1e5c0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1e5d0 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1e5e0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1e5f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1e600 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1e610 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1e620 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e630 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1e640 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1e650 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1e660 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1e670 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1e680 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1e690 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1e6a0 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1e6b0 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1e6c0 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1e6d0 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1e6e0 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1e6f0 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1e700 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1e710 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1e720 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1e730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e740 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1e750 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1e760 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e790 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e7a0 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7c0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1e7d0 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1e7e0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e7f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e810 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1e820 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1e830 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1e840 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1e850 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1e860 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1e870 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1e880 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1e890 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1e8a0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1e8b0 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1e8c0 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1e8d0 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1e8e0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1e8f0 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1e900 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1e910 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1e920 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1e930 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1e940 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1e950 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1e960 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1e970 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e980 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1e990 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1e9a0 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1e9b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e9c0 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1e9d0 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1e9e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
1e9f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1ea00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1ea10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ea20 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1ea30 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1ea40 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1ea50 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1ea60 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1ea70 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1ea80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ea90 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1eaa0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1eab0 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1eac0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1ead0 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1eae0 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1eaf0 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1eb00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1eb10 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1eb20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1eb30 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1eb40 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1eb50 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1eb60 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1eb70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1eb80 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1eb90 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1eba0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1ebb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ebc0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1ebd0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1ebe0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1ebf0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec10 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1ec20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1ec30 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1ec40 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1ec50 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1ec60 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1ec70 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1ec80 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1ec90 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1eca0 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1ecb0 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1ecc0 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1ecd0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1ece0 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1ecf0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1ed00 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1ed10 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1ed20 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1ed30 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1ed40 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1ed50 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1ed60 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1ed70 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1ed80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1ed90 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1eda0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1edb0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1edc0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50  RED_LOCK );.  nP
1edd0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1ede0 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1edf0 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1ee00 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ee10 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62   was not availab
1ee20 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1ee30 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a  sub-system,.  **
1ee40 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61   determine it ba
1ee50 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  sed on the size 
1ee60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ee70 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a  file. If the siz
1ee80 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61  e.  ** of the da
1ee90 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1eea0 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
1eeb0 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
1eec0 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f  ge-size,.  ** ro
1eed0 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  und down to the 
1eee0 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78  nearest page. Ex
1eef0 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c  cept, any file l
1ef00 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a  arger than 0.  *
1ef10 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  * bytes in size 
1ef20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1ef30 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
1ef40 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f  t one page..  */
1ef50 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1ef60 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
1ef70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ef80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ef90 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
1efa0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1efb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1efc0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1efd0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1efe0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1eff0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  >fd) ){.      in
1f000 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
1f010 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1f020 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  >fd, &n);.      
1f030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1f050 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f060 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
1f070 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67  = (Pgno)((n+pPag
1f080 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20  er->pageSize-1) 
1f090 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
1f0a0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
1f0b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
1f0c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f0d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
1f0e0 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
1f0f0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1f100 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1f110 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1f120 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1f130 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1f140 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1f150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1f160 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1f170 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1f180 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1f190 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
1f1a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1f1b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f1c0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
1f1d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1f1e0 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
1f1f0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
1f200 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1f210 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
1f220 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
1f230 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
1f240 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1f250 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
1f260 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
1f270 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
1f280 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
1f290 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
1f2a0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
1f2b0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
1f2c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1f2d0 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
1f2e0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1f2f0 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
1f300 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
1f310 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1f320 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
1f330 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
1f340 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
1f350 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1f360 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
1f370 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
1f380 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
1f390 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1f3a0 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
1f3b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
1f3c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1f3d0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1f3e0 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
1f3f0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1f400 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1f410 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
1f420 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
1f430 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1f440 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
1f450 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
1f460 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
1f470 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
1f480 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
1f490 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
1f4a0 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
1f4b0 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
1f4c0 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
1f4d0 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
1f4e0 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
1f4f0 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
1f500 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
1f510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f520 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
1f530 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
1f540 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1f550 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1f560 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f570 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1f580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f590 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1f5a0 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  D_LOCK );..  if(
1f5b0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1f5c0 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
1f5d0 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
1f5e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1f5f0 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
1f600 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ts */.    Pgno n
1f610 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1f620 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1f630 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f640 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20  file */..    rc 
1f650 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
1f660 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
1f670 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1f680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
1f690 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1f6a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f6b0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
1f6c0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1f6d0 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Wal, 0);.      i
1f6e0 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
1f6f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f700 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1f710 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1f720 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
1f730 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
1f740 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
1f750 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
1f760 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1f770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f780 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
1f790 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f7a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1f7b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
1f7c0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
1f7d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f7e0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
1f7f0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
1f800 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1f810 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1f820 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1f830 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
1f840 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f850 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
1f860 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
1f870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f890 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f8a0 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
1f8b0 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
1f8c0 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
1f8d0 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
1f8e0 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
1f8f0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
1f900 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
1f910 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
1f920 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
1f930 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
1f940 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
1f950 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
1f960 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
1f970 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
1f980 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
1f990 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
1f9a0 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
1f9b0 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
1f9c0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1f9d0 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
1f9e0 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
1f9f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
1fa00 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
1fa10 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
1fa20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
1fa30 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
1fa40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
1fa50 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
1fa60 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
1fa70 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
1fa80 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
1fa90 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
1faa0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
1fab0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
1fac0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
1fad0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1fae0 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
1faf0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1fb00 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
1fb10 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
1fb20 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
1fb30 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
1fb40 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
1fb50 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
1fb60 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1fb70 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
1fb80 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
1fb90 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
1fba0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
1fbb0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1fbc0 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
1fbd0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
1fbe0 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
1fbf0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1fc00 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
1fc10 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
1fc20 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
1fc30 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
1fc40 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
1fc50 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
1fc60 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
1fc70 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
1fc80 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
1fc90 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
1fca0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1fcb0 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
1fcc0 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
1fcd0 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
1fce0 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
1fcf0 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
1fd00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
1fd10 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
1fd20 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
1fd30 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
1fd40 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
1fd50 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
1fd60 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1fd70 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
1fd80 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
1fd90 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
1fda0 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
1fdb0 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
1fdc0 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
1fdd0 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
1fde0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
1fdf0 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
1fe00 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1fe10 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
1fe20 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
1fe30 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
1fe40 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
1fe50 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
1fe60 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
1fe70 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
1fe80 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
1fe90 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
1fea0 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
1feb0 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
1fec0 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
1fed0 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
1fee0 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
1fef0 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
1ff00 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
1ff10 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1ff20 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
1ff30 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
1ff40 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
1ff50 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
1ff60 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
1ff70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
1ff80 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
1ff90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ffa0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
1ffb0 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
1ffc0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1ffd0 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
1ffe0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
1fff0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
20000 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
20010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20020 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
20030 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
20040 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
20050 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20060 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
20070 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
20080 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
20090 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
200a0 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
200b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
200c0 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
200d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
200e0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
200f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20100 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
20110 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
20120 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
20130 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
20140 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
20150 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
20160 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
20170 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
20180 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
20190 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
201a0 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
201b0 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
201c0 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
201d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
201e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
201f0 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
20200 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
20210 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
20220 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
20230 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
20240 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
20250 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
20260 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
20270 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
20280 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
20290 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
202a0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  ze;.  pPager->ch
202b0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
202c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
202d0 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
202e0 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
202f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
20300 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
20310 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
20320 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
20330 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
20340 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
20350 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
20360 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
20370 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
20380 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
20390 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
203a0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
203b0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
203c0 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
203d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
203e0 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
203f0 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
20400 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
20410 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
20420 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
20430 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
20440 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
20450 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
20460 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
20470 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
20480 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
20490 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
204a0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
204b0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
204c0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
204d0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
204e0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
204f0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
20500 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
20510 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
20520 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
20530 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
20540 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
20550 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
20560 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
20570 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
20580 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
20590 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
205a0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
205b0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
205c0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
205d0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
205e0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
205f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
20600 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
20610 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20620 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
20630 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
20640 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
20650 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
20660 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
20670 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20680 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
20690 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
206a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
206b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
206c0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
206d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
206e0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
206f0 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
20700 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
20710 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
20720 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
20730 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
20740 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
20750 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20760 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
20770 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
20780 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
20790 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
207a0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
207b0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
207c0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
207d0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
207e0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
207f0 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
20800 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
20810 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
20820 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
20830 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
20840 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
20850 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
20860 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
20870 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
20880 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
20890 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
208a0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
208b0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
208c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
208d0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
208e0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
208f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
20900 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
20910 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
20920 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
20930 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
20940 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
20950 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
20960 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
20970 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
20980 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
20990 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
209a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
209b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
209c0 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
209d0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
209e0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
209f0 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
20a00 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
20a10 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
20a20 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
20a30 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
20a40 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
20a50 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
20a60 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
20a70 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
20a80 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
20a90 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
20aa0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
20ab0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
20ac0 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
20ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
20ae0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
20af0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
20b00 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
20b10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
20b20 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
20b30 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
20b40 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
20b50 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
20b60 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
20b70 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
20b80 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
20b90 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
20ba0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20bb0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
20bc0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20bd0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
20be0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
20bf0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
20c00 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
20c10 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
20c20 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
20c30 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
20c40 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
20c50 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
20c60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
20c70 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
20c80 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
20c90 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
20ca0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
20cb0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
20cc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
20cd0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
20ce0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
20cf0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20d00 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
20d10 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65  set = (i64)pSave
20d20 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
20d30 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
20d40 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  ze);..    if( pa
20d50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20d60 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
20d70 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
20d80 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  intUndo(pPager->
20d90 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74  pWal, pSavepoint
20da0 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20  ->aWalData);.   
20db0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53   }.    for(ii=pS
20dc0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
20dd0 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
20de0 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
20df0 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
20e00 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
20e10 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b  set==(i64)ii*(4+
20e20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20e30 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
20e40 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
20e50 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
20e60 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20  &offset, pDone, 
20e70 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
20e80 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20e90 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
20ea0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
20eb0 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
20ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
20ee0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20ef0 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  szJ;.  }..  retu
20f00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20f10 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
20f20 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
20f30 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
20f40 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
20f50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
20f60 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
20f70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
20f80 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
20f90 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
20fa0 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
20fb0 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
20fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
20fd0 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
20fe0 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
20ff0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f  the pager..*/.vo
21000 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
21010 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61  hrink(Pager *pPa
21020 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
21030 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67  cacheShrink(pPag
21040 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
21050 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
21060 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
21070 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
21080 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
21090 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
210a0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
210b0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
210c0 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
210d0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
210e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
210f0 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
21100 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
21110 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
21120 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
21130 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
21140 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
21150 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
21160 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
21170 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
21180 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
21190 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
211a0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
211b0 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
211c0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
211d0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
211e0 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
211f0 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
21200 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
21210 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
21220 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
21230 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
21240 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
21250 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
21270 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
21280 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
21290 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
212a0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
212b0 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
212c0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
212d0 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
212e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
212f0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
21300 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
21310 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
21320 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
21330 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
21340 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
21350 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
21370 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
21380 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
21390 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
213a0 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
213b0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
213c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
213d0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
213e0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
213f0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
21400 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
21410 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
21420 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
21430 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
21440 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
21450 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
21460 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
21480 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
21490 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
214a0 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
214b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
214c0 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
214d0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
214e0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
214f0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
21500 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
21510 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
21520 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
21530 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
21540 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
21550 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
21560 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
21570 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
21580 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
21590 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
215a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
215b0 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
215c0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
215d0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
215e0 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
215f0 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
21600 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
21610 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
21620 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
21630 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
21640 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
21650 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
21660 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
21670 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
21680 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
21690 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
216a0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
216b0 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
216c0 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
216d0 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
216e0 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
216f0 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
21700 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
21710 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a   with NORMAL..**
21720 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
21730 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
21740 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
21750 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
21760 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
21770 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
21780 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
21790 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
217a0 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
217b0 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
217c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
217d0 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
217e0 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
217f0 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
21800 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
21810 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
21820 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
21830 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
21840 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
21850 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
21860 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
21870 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
21880 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
21890 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
218a0 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
218b0 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
218c0 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
218d0 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
218e0 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
218f0 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
21900 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
21910 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
21920 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
21930 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
21940 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
21950 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
21960 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
21970 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
21980 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
21990 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a  Level(.  Pager *
219a0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
219b0 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73  * The pager to s
219c0 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  et safety level 
219d0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76  for */.  int lev
219e0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  el,            /
219f0 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
21a00 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
21a10 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
21a20 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46  /  .  int bFullF
21a30 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50  sync,       /* P
21a40 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20  RAGMA fullfsync 
21a50 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75  */.  int bCkptFu
21a60 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52  llFsync    /* PR
21a70 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
21a80 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a  fullfsync */.){.
21a90 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
21aa0 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
21ab0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
21ac0 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
21ad0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
21ae0 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
21af0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
21b00 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
21b10 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
21b20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67  ?1:0;.  if( pPag
21b30 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
21b40 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21b50 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
21b60 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
21b70 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
21b80 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29  if( bFullFsync )
21b90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
21ba0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
21bb0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
21bc0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21bd0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
21be0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
21bf0 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46  e if( bCkptFullF
21c00 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  sync ){.    pPag
21c10 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
21c20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
21c30 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
21c40 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
21c50 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21c60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
21c70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21c80 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21c90 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21ca0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21cb0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21cc0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61  ORMAL;.  }.  pPa
21cd0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
21ce0 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  s = pPager->sync
21cf0 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61  Flags;.  if( pPa
21d00 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
21d10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
21d20 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c  SyncFlags |= WAL
21d30 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
21d40 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  NS;.  }.}.#endif
21d50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
21d60 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
21d70 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
21d80 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
21d90 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
21da0 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
21db0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
21dc0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
21dd0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
21de0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
21df0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
21e00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
21e10 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
21e20 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
21e30 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
21e40 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
21e50 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
21e60 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
21e70 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
21e80 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
21e90 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
21ea0 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
21eb0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
21ec0 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
21ed0 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
21ee0 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
21ef0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
21f00 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
21f10 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
21f20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
21f30 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
21f40 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
21f50 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
21f60 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
21f70 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
21f80 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
21f90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
21fa0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
21fb0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
21fc0 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
21fd0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
21fe0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
21ff0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
22000 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
22010 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
22020 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
22030 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
22040 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
22050 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
22060 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
22070 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
22080 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
22090 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
220a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
220b0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
220c0 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
220d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
220e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
220f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
22100 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
22110 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
22120 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
22130 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
22140 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
22150 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
22160 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
22170 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22180 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
22190 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
221a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
221b0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
221c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
221d0 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
221e0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
221f0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
22200 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
22210 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
22220 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
22230 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
22240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22250 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
22260 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
22270 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
22280 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
22290 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
222a0 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
222b0 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
222c0 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
222d0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
222e0 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
222f0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
22300 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
22310 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
22320 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
22330 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
22340 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
22350 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
22360 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
22370 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
22380 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
22390 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
223a0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
223b0 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
223c0 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
223d0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
223e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
223f0 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
22400 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
22410 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
22420 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
22430 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
22440 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
22450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
22480 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
22490 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
224a0 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
224b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
224c0 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
224d0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
224e0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
224f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
22500 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
22510 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
22520 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
22530 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
22540 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
22550 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
22560 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
22570 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
22580 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
22590 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
225a0 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
225b0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
225c0 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
225d0 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
225e0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
225f0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
22600 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
22610 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
22640 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
22650 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
22660 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
22670 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
22680 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
22690 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
226a0 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
226b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
226c0 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
226d0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
226e0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
226f0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
22700 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
22710 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
22720 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
22730 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
22740 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
22750 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
22760 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
22770 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
22780 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
22790 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
227a0 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
227b0 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
227c0 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
227d0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
227e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
227f0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
22800 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
22810 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20  TL_BUSYHANDLER, 
22820 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d  (void *)ap);.  }
22830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
22840 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
22850 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
22860 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
22870 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
22880 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
22890 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
228a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
228b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
228c0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
228d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
228e0 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
228f0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
22900 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
22910 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
22920 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
22930 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
22940 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
22950 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72  _xxx sub-code or
22960 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
22970 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
22980 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
22990 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
229a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
229b0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
229c0 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
229d0 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
229e0 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
229f0 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
22a00 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
22a10 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
22a20 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
22a30 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
22a40 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
22a50 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
22a60 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
22a70 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
22a80 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
22a90 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
22aa0 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
22ab0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
22ac0 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
22ad0 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
22ae0 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
22af0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
22b00 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
22b10 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
22b20 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
22b30 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
22b40 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
22b50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
22b60 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
22b70 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
22b80 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
22b90 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
22ba0 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
22bb0 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
22bc0 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
22bd0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
22be0 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
22bf0 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
22c00 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
22c10 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
22c20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
22c30 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
22c40 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
22c50 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
22c60 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
22c70 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
22c80 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
22c90 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
22ca0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
22cb0 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
22cc0 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
22cd0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
22ce0 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
22cf0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
22d00 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
22d10 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
22d20 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
22d30 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
22d40 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
22d50 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
22d60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22d70 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
22d80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32  ger *pPager, u32
22d90 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74   *pPageSize, int
22da0 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
22db0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22dc0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  ;..  /* It is no
22dd0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f  t possible to do
22de0 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70   a full assert_p
22df0 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72  ager_state() her
22e00 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20  e, as this.  ** 
22e10 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
22e20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
22e30 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20  in PagerOpen(), 
22e40 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65  before the state
22e50 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67  .  ** of the Pag
22e60 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74  er object is int
22e70 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
22e80 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74  nt..  **.  ** At
22e90 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
22ea0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
22eb0 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
22ec0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a  e pager was in .
22ed0 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
22ee0 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63   state. But sinc
22ef0 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  e PAGER_ERROR st
22f00 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ate guarantees t
22f10 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  hat.  ** there i
22f20 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
22f30 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
22f40 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20  reference, this 
22f50 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
22f60 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61   a no-op for tha
22f70 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20  t case anyhow.. 
22f80 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53   */..  u32 pageS
22f90 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
22fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
22fb0 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
22fc0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
22fd0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
22fe0 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
22ff0 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d    if( (pPager->m
23000 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
23010 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
23020 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
23030 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
23040 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
23050 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26    && pageSize &&
23060 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29   pageSize!=(u32)
23070 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23080 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
23090 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20  *pNew = NULL;   
230a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
230b0 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20   temp space */. 
230c0 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30     i64 nByte = 0
230d0 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
230e0 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
230f0 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70  OPEN && isOpen(p
23100 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23120 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
23130 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a  r->fd, &nByte);.
23140 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23160 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61       pNew = (cha
23170 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
23180 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
23190 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
231a0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
231b0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OMEM;.    }..   
231c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
231d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
231e0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
231f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
23200 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28  bSize = (Pgno)((
23210 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31  nByte+pageSize-1
23220 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  )/pageSize);.   
23230 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
23240 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
23250 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
23260 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
23270 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
23280 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
23290 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
232a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
232b0 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
232c0 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
232d0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ze);.    }.  }..
232e0 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
232f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
23300 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
23320 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
23330 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
23340 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
23350 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
23360 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
23370 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
23380 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
23390 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
233a0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
233b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
233c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
233d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
233e0 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
233f0 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
23400 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
23410 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
23420 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
23430 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
23440 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
23450 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
23460 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
23470 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
23480 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
23490 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
234a0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
234b0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
234c0 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
234d0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
234e0 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
234f0 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
23500 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
23510 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
23520 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
23530 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
23540 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
23550 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
23560 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
23570 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
23580 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
23590 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
235a0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
235b0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
235c0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
235d0 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
235e0 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
235f0 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
23600 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
23610 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
23620 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
23630 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
23640 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
23650 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
23660 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
23670 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
23680 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
23690 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
236a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
236b0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
236c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
236d0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
236e0 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
236f0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
23700 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61   mxPage;.  }.  a
23710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
23720 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
23730 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c  N );      /* Cal
23740 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d  led only by OP_M
23750 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73  axPgcnt */.  ass
23760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
23770 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
23780 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61  ize );  /* OP_Ma
23790 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20  xPgcnt enforces 
237a0 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  this */.  return
237b0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
237c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
237d0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
237e0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
237f0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
23800 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
23810 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
23820 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
23830 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
23840 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
23850 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
23860 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
23870 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
23880 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
23890 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
238a0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
238b0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
238c0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
238d0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
238e0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
238f0 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
23900 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
23910 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
23920 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
23930 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
23940 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
23950 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
23960 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
23970 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
23980 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
23990 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
239a0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
239b0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
239c0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
239d0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
239e0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
239f0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
23a00 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
23a10 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
23a20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
23a30 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
23a40 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
23a50 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23a60 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
23a70 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
23a80 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
23a90 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
23aa0 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
23ab0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
23ac0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
23ad0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
23ae0 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
23af0 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
23b00 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
23b10 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
23b20 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
23b30 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
23b40 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
23b50 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
23b60 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
23b70 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
23b80 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
23b90 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
23ba0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
23bb0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
23bc0 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
23bd0 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
23be0 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
23bf0 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
23c00 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
23c10 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
23c20 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
23c30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
23c40 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
23c50 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
23c60 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
23c70 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
23c80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
23c90 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
23ca0 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
23cb0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
23cc0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
23cd0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
23ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
23cf0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
23d00 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
23d10 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
23d20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
23d30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23d40 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
23d50 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
23d60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23d70 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
23d80 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
23d90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
23da0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
23db0 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
23dc0 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
23dd0 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
23de0 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
23df0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
23e00 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
23e10 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
23e20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
23e30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
23e40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
23e50 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
23e60 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
23e70 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
23e80 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
23e90 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
23ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23eb0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
23ec0 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
23ed0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23ee0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
23ef0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
23f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23f10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
23f20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
23f30 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
23f40 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
23f50 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
23f60 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
23f70 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
23f80 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
23f90 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
23fa0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
23fb0 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
23fc0 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
23fd0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
23fe0 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
23ff0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
24000 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
24010 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
24020 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
24030 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
24040 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
24050 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
24060 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24070 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
24080 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
24090 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
240a0 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
240b0 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
240c0 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
240d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
240e0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
240f0 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
24100 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
24110 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24120 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
24130 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
24140 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
24150 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
24160 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
24170 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
24180 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
24190 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
241a0 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
241b0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
241c0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
241d0 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
241e0 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
241f0 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
24200 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
24210 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
24220 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
24230 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
24240 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
24250 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
24260 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
24270 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
24280 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
24290 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
242a0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
242b0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
242c0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
242d0 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
242e0 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
242f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
24300 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
24310 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
24320 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
24330 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
24340 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
24350 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
24360 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24370 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
24380 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
243b0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
243c0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
243d0 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
243e0 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
243f0 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
24400 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
24410 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
24420 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
24430 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
24440 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
24450 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
24460 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
24470 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
24480 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
24490 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
244a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
244b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
244c0 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
244d0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
244e0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
244f0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
24500 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
24510 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
24520 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
24530 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
24540 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
24550 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
24560 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
24570 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
24580 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
24590 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
245a0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
245b0 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
245c0 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
245d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
245e0 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
245f0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
24600 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
24610 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
24620 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
24630 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
24640 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
24650 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
24660 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
24670 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
24680 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
24690 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
246a0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
246b0 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
246c0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
246d0 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
246e0 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
246f0 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
24700 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
24710 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
24720 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
24730 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
24740 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
24750 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
24760 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
24770 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
24780 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
24790 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
247a0 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
247b0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
247c0 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
247d0 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
247e0 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
247f0 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
24800 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
24810 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
24820 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
24830 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
24840 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
24850 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
24860 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
24870 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
24880 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24890 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
248a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
248b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
248c0 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
248d0 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
248e0 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64   behaviour would
248f0 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
24900 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
24910 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
24920 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
24930 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
24940 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
24950 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
24960 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
24970 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
24980 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
24990 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
249a0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
249b0 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
249c0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
249d0 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
249e0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
249f0 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
24a00 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
24a10 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
24a20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
24a30 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
24a40 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
24a50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
24a60 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
24a70 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
24a80 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
24a90 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
24aa0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
24ab0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
24ac0 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
24ad0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
24ae0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
24af0 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
24b00 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
24b10 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
24b20 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
24b30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
24b40 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
24b50 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
24b60 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
24b70 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
24b80 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
24b90 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
24ba0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
24bb0 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
24bc0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
24bd0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
24be0 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
24bf0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
24c00 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
24c10 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
24c20 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
24c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
24c40 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
24c50 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
24c60 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
24c70 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
24c80 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
24c90 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
24ca0 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
24cb0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
24cc0 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
24cd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24ce0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
24cf0 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
24d00 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
24d10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24d20 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
24d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24d40 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
24d50 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
24d60 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
24d70 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
24d80 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
24d90 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
24da0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
24db0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
24dc0 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
24dd0 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
24de0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
24df0 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
24e00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
24e10 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
24e20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
24e30 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
24e40 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
24e50 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
24e60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
24e70 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
24e80 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
24e90 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
24ea0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
24eb0 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
24ec0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
24ed0 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
24ee0 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
24ef0 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
24f00 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
24f10 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
24f20 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
24f30 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
24f40 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
24f50 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
24f60 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
24f70 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
24f80 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
24f90 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
24fa0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
24fb0 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
24fc0 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
24fd0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24fe0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
24ff0 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
25000 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
25010 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
25020 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
25030 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
25040 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25050 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
25060 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
25070 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
25080 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
25090 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
250a0 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
250b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
250c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
250d0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
250e0 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
250f0 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
25100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25110 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
25120 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
25130 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
25140 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
25150 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
25160 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
25170 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
25180 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
25190 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
251a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
251b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
251c0 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
251d0 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
251e0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
251f0 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
25200 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
25210 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
25220 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
25230 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
25240 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
25250 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
25260 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
25270 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
25280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
25290 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
252a0 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
252b0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
252c0 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
252d0 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
252e0 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
252f0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
25300 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
25310 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
25320 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
25330 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
25340 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
25350 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
25360 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
25370 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
25380 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
25390 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  r){.  u8 *pTmp =
253a0 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
253b0 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73  TmpSpace;..  ass
253c0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
253d0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
253e0 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
253f0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
25400 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
25410 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
25420 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
25430 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20  rrCode = 0; */. 
25440 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
25450 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
25460 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25470 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  WAL.  sqlite3Wal
25480 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
25490 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  al, pPager->ckpt
254a0 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65  SyncFlags, pPage
254b0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d  r->pageSize, pTm
254c0 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57  p);.  pPager->pW
254d0 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  al = 0;.#endif. 
254e0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
254f0 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
25500 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
25510 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
25520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
25530 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79  f it is open, sy
25540 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
25550 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
25560 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  ng UnlockAndRoll
25570 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20  back..    ** If 
25580 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65  this is not done
25590 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63  , then an unsync
255a0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
255b0 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a  e open journal .
255c0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20      ** file may 
255d0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
255e0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
255f0 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
25600 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20  lure occurs .   
25610 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69   ** while this i
25620 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
25630 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
25640 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
25650 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
25660 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
25670 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
25680 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
25690 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67  l, shift the pag
256a0 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  er.    ** into t
256b0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
256c0 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f  This causes Unlo
256d0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f  ckAndRollback to
256e0 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20   unlock the.    
256f0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ** database and 
25700 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
25710 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  l file without a
25720 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
25730 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b  l it.    ** back
25740 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e   or finalize it.
25750 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61   The next databa
25760 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76  se user will hav
25770 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72  e to do hot-jour
25780 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  nal.    ** rollb
25790 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73  ack before acces
257a0 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
257b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
257c0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
257d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
257e0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
257f0 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e  pPager, pagerSyn
25800 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
25810 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
25820 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
25830 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
25840 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
25850 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
25860 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
25870 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
25880 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
25890 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
258a0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
258b0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
258c0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
258d0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
258e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
258f0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
25900 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
25910 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
25920 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  pTmp);.  sqlite3
25930 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67  PcacheClose(pPag
25940 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23  er->pPCache);..#
25950 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
25960 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61  _CODEC.  if( pPa
25970 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
25980 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
25990 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
259a0 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  dec);.#endif..  
259b0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
259c0 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21  >aSavepoint && !
259d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
259e0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
259f0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
25a00 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
25a10 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b  pPager->sjfd) );
25a20 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
25a30 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
25a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25a50 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
25a60 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
25a70 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
25a80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
25a90 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
25aa0 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f  age pPg..*/.Pgno
25ab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25ac0 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
25ad0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
25ae0 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64  Pg->pgno;.}.#end
25af0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
25b00 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
25b10 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
25b20 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   pPg..*/.void sq
25b30 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
25b40 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
25b50 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
25b60 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  Pg);.}../*.** Sy
25b70 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
25b80 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
25b90 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
25ba0 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
25bb0 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
25bc0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
25bd0 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
25be0 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
25bf0 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
25c00 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73  k and can be res
25c10 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  tored in the eve
25c20 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  nt of a hot-jour
25c30 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  nal rollback..**
25c40 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72  .** If the Pager
25c50 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20  .noSync flag is 
25c60 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
25c70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
25c80 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
25c90 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
25ca0 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
25cb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
25cc0 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65  e and the .** de
25cd0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
25ce0 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65  tics of the file
25cf0 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
25d00 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
25d10 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
25d20 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
25d30 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
25d40 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
25d50 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
25d60 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
25d70 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
25d80 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
25d90 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
25da0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
25db0 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
25dc0 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
25dd0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
25de0 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
25df0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
25e00 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
25e10 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
25e20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
25e30 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
25e40 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
25e50 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
25e60 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
25e70 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
25e80 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
25e90 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
25ea0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
25eb0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
25ec0 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
25ed0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
25ee0 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
25ef0 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
25f00 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
25f10 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
25f20 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
25f30 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
25f40 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
25f50 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
25f60 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
25f70 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
25f80 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
25f90 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
25fa0 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
25fb0 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
25fc0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
25fd0 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
25fe0 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
25ff0 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
26000 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
26010 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
26020 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
26030 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
26040 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
26050 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
26060 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
26070 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
26080 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
26090 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
260a0 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
260b0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
260c0 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
260d0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
260e0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
260f0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
26100 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
26110 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
26120 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
26130 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a  r, int newHdr){.
26140 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26170 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
26180 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
26190 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
261a0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
261b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
261c0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
261d0 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
261e0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
261f0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
26200 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
26210 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
26220 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
26230 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
26240 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
26250 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26260 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
26270 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
26280 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
26290 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
262a0 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
262b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
262c0 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
262d0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
262e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
262f0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f  MORY ){.      co
26300 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
26310 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
26320 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
26330 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
26340 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
26350 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
26360 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
26370 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
26380 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
26390 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
263a0 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
263b0 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
263c0 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
263d0 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
263e0 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
263f0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
26400 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
26410 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
26420 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
26430 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
26440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
26450 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
26460 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
26470 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
26480 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
26490 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
264a0 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
264b0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
264c0 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
264d0 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
264e0 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
264f0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
26500 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
26510 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
26520 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
26530 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
26540 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
26550 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
26560 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
26570 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
26580 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
26590 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
265a0 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
265b0 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
265c0 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
265d0 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
265e0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
265f0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
26600 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
26610 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
26620 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
26630 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
26640 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
26650 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
26660 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
26670 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
26680 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
26690 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
266a0 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
266b0 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
266c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
266d0 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
266e0 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
266f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
26700 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
26710 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
26720 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
26730 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26740 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
26750 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
26760 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
26770 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
26780 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
26790 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
267a0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
267b0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
267c0 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
267d0 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
267e0 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
267f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
26800 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
26810 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
26820 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
26830 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
26840 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
26850 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
26860 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
26870 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
26880 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
26890 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
268a0 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
268b0 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
268c0 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
268d0 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
268e0 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
268f0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
26900 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
26910 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
26920 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
26930 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
26940 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
26950 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
26960 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
26970 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
26980 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
26990 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
269a0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
269b0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
269c0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
269d0 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
269e0 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
269f0 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
26a00 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
26a10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
26a20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
26a30 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
26a40 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
26a50 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
26a60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26a70 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
26a80 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
26a90 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
26aa0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
26ab0 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
26ac0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
26ad0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
26ae0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
26af0 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
26b00 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
26b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26b20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26b30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
26b40 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
26b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
26b60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
26b70 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
26b80 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
26b90 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
26ba0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
26bb0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
26bc0 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
26bd0 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
26be0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
26bf0 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
26c00 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
26c10 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
26c20 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
26c30 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
26c40 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
26c50 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
26c60 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
26c70 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
26c80 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
26c90 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
26ca0 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
26cb0 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
26cc0 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
26cd0 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
26ce0 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
26cf0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
26d00 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
26d10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
26d20 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
26d30 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
26d40 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
26d50 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
26d60 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
26d70 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
26d80 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
26d90 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
26da0 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
26db0 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
26dc0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
26dd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26de0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
26df0 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
26e00 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
26e10 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
26e20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
26e30 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
26e40 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
26e50 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
26e60 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
26e70 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
26e80 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
26e90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26ea0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
26eb0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
26ec0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
26ed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26ee0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
26ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26f00 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
26f10 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
26f20 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
26f30 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
26f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26f50 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
26f60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
26f70 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
26f80 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
26f90 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
26fa0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
26fb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26fc0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
26fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26fe0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
26ff0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
27000 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
27010 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
27020 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
27030 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27040 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
27050 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
27060 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
27070 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27080 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
27090 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
270a0 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  cFlags| .       
270b0 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
270c0 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  Flags==SQLITE_SY
270d0 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
270e0 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
270f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27110 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27120 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27130 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27140 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
27150 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
27160 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d  if( newHdr && 0=
27170 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
27180 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
27190 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
271a0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
271b0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
271c0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
271d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
271e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
271f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27200 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
27210 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27220 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
27230 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
27240 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65  }.  }..  /* Unle
27250 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
27260 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20  in noSync mode, 
27270 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27280 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20   was just .  ** 
27290 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
272a0 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ced. Either way,
272b0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
272c0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
272d0 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67  on .  ** all pag
272e0 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
272f0 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
27300 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
27310 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65  PCache);.  pPage
27320 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
27330 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a  R_WRITER_DBMOD;.
27340 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
27350 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
27360 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
27370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27380 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
27390 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
273a0 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
273b0 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
273c0 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
273d0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
273e0 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
273f0 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
27400 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
27410 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
27420 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
27430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27440 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
27450 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
27460 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
27470 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
27480 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
27490 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
274a0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
274b0 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
274c0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
274d0 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
274e0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
274f0 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
27500 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
27510 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
27520 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
27530 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
27540 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
27550 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
27560 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
27570 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
27580 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
27590 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
275a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
275b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
275c0 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
275d0 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
275e0 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
275f0 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
27600 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
27610 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
27620 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
27630 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
27640 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
27650 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
27660 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
27670 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
27680 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
27690 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
276a0 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
276b0 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
276c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
276d0 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
276e0 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
276f0 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
27700 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
27710 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
27720 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
27730 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
27740 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
27750 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
27760 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
27770 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
27780 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
27790 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
277a0 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
277b0 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
277c0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
277d0 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
277e0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
277f0 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
27800 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
27810 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
27820 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
27830 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
27840 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
27850 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
27860 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
27870 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
27880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27890 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
278a0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
278b0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
278c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
278d0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
278e0 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
278f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
27900 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
27910 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
27920 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
27930 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
27940 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
27950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
27960 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
27970 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ist(Pager *pPage
27980 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29  r, PgHdr *pList)
27990 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
279a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
279b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
279c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
279d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
279e0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
279f0 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72  r rollback pager
27a00 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f  s in WRITER_DBMO
27a10 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73  D state. */.  as
27a20 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
27a30 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
27a40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27a50 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
27a60 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20  ITER_DBMOD );.  
27a70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27a80 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
27a90 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
27aa0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
27ab0 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
27ac0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
27ad0 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
27ae0 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
27af0 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
27b00 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
27b10 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
27b20 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
27b30 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
27b40 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
27b50 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
27b60 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
27b70 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
27b80 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
27b90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27ba0 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
27bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27bc0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
27bd0 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
27be0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
27bf0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
27c00 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65  .  /* Before the
27c10 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69   first write, gi
27c20 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e  ve the VFS a hin
27c30 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69  t of what the fi
27c40 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69  nal.  ** file si
27c50 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f  ze will be..  */
27c60 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
27c70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
27c80 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
27c90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
27ca0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
27cb0 3e 64 62 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e  >dbSize>pPager->
27cc0 64 62 48 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20  dbHintSize ){.  
27cd0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
27ce0 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
27cf0 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
27d00 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
27d10 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
27d20 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
27d30 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
27d40 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
27d50 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
27d60 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
27d70 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
27d80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
27d90 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
27da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
27db0 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
27dc0 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
27dd0 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
27de0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
27df0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
27e00 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
27e10 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
27e20 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
27e30 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
27e40 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
27e50 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
27e60 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
27e70 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
27e80 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
27e90 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
27ea0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
27eb0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
27ec0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
27ed0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
27ee0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
27ef0 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
27f00 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
27f10 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
27f20 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
27f30 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
27f40 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
27f50 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
27f60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
27f70 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
27f80 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
27f90 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
27fa0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
27fb0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
27fc0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
27fd0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
27fe0 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
27ff0 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
28000 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
28030 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
28040 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
28050 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
28060 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
28070 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
28080 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
28090 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
280a0 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
280b0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
280c0 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
280d0 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
280e0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
280f0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
28100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
28110 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
28120 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
28130 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
28140 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
28150 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
28160 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
28170 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28180 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
28190 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
281a0 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
281b0 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
281c0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
281d0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
281e0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
281f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
28200 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
28210 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
28220 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
28230 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
28240 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
28250 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
28260 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
28270 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
28280 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
28290 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
282a0 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
282b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
282c0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
282d0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
282e0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
282f0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
28300 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
28310 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
28320 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
28330 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
28340 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  TE]++;..      /*
28350 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
28360 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
28370 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
28380 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
28390 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
283a0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
283b0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
283c0 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
283d0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
283e0 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
283f0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
28400 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
28420 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
28430 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
28440 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
28450 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
28460 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
28470 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
28480 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
28490 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
284a0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
284b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
284c0 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
284d0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
284e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
284f0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
28500 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
28510 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
28520 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
28530 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
28540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28550 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
28560 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
28570 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
28580 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
28590 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
285a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
285b0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
285c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
285d0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
285e0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
285f0 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
28600 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
28610 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
28620 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
28630 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
28640 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
28650 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
28660 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
28670 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
28680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28690 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
286a0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
286b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
286c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
286d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
286e0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
286f0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
28700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
28710 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
28720 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
28730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
28740 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
28750 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
28760 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
28770 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
28780 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28790 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
287a0 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
287b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
287c0 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
287d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
287e0 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
287f0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
28800 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
28810 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
28820 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
28830 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
28840 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
28850 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
28860 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
28870 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
28880 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
28890 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
288a0 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
288b0 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
288c0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
288d0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
288e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
288f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
28900 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
28910 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
28920 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
28930 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
28940 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
28950 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
28960 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
28970 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
28980 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
28990 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
289a0 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
289b0 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
289c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
289d0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
289e0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
289f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28a00 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
28a10 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
28a20 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
28a30 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
28a40 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
28a50 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
28a60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
28a70 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
28a80 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
28a90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28aa0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
28ab0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
28ac0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28ad0 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
28ae0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
28af0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
28b00 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
28b10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
28b20 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
28b30 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
28b40 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
28b50 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
28b60 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
28b70 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
28b80 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
28b90 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
28ba0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
28bb0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
28bc0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
28bd0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
28be0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
28bf0 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
28c00 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
28c10 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
28c20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
28c30 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
28c40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28c50 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
28c60 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
28c70 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
28c80 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65  set = (i64)pPage
28c90 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
28ca0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
28cb0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
28cc0 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
28cd0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
28ce0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
28cf0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
28d00 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
28d10 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
28d20 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
28d30 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
28d40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
28d50 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
28d60 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
28d70 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
28d80 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
28d90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
28da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28db0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28dc0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
28dd0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
28de0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
28df0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
28e00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28e10 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
28e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
28e30 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
28e40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
28e50 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
28e60 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
28e70 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
28e80 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
28e90 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
28ea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28eb0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
28ec0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
28ed0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
28ee0 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
28ef0 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
28f00 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
28f10 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
28f20 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
28f30 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
28f40 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
28f50 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
28f60 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
28f70 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
28f80 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
28f90 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
28fa0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
28fb0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
28fc0 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
28fd0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
28fe0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
28ff0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
29000 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
29010 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
29020 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
29030 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
29040 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
29050 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
29060 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
29070 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
29080 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
29090 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
290a0 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
290b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
290c0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
290d0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
290e0 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
290f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
29100 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
29110 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
29120 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
29130 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
29140 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
29150 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
29160 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
29170 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
29180 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
29190 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
291a0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
291b0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
291c0 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
291d0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
291e0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
291f0 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
29200 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
29210 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
29220 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
29230 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
29240 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
29250 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29260 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
29270 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
29280 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
29290 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
292a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
292b0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
292c0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
292d0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
292e0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
292f0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
29300 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
29310 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65  Spill flag is se
29320 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
29330 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
29340 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
29350 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
29360 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
29370 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
29380 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
29390 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
293a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
293b0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
293c0 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
293d0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
293e0 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
293f0 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
29400 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
29410 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74  ill flag inhibit
29420 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
29430 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ling regardless 
29440 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  of whether.  ** 
29450 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
29460 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
29470 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61   is set during a
29480 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a   rollback..  **.
29490 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
294a0 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
294b0 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
294c0 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
294d0 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
294e0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
294f0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
29500 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
29510 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20  ementaton it .  
29520 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
29530 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
29540 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
29550 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
29560 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77  teFlag==1.  ** w
29570 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
29580 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
29590 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
295a0 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
295b0 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
295c0 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
295d0 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
295e0 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
295f0 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
29600 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
29610 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
29620 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
29630 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
29640 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
29650 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
29660 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
29670 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
29680 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29  er->doNotSpill )
29690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
296a0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
296b0 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20  >doNotSyncSpill 
296c0 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  && (pPg->flags &
296d0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
296e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
296f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29700 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
29710 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
29720 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
29730 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
29740 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
29750 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
29760 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
29770 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
29780 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20  Page(pPg) ){ .  
29790 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
297a0 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20  nalPage(pPg); . 
297b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
297c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
297d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
297e0 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
297f0 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
29800 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
29810 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
29820 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
29830 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
29840 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
29850 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
29860 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
29870 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
29880 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
29890 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
298a0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
298b0 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
298c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
298d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69  ge number of thi
298e0 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72  s page is larger
298f0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
29900 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  t size of.    **
29910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
29920 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
29930 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
29940 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
29950 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  l..    ** This i
29960 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
29970 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
29980 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
29990 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
299a0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
299b0 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
299c0 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
299d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
299e0 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
299f0 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  owing sequence o
29a00 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a  f events:.    **
29a10 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  .    **   BEGIN;
29a20 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  .    **     <jou
29a30 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20  rnal page X>.   
29a40 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
29a50 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
29a60 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
29a70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  .    **       <s
29a80 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
29a90 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
29aa0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67      **       pag
29ab0 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
29ac0 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  .    **     ROLL
29ad0 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20  BACK TO sp;.    
29ae0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e  **.    ** If (X>
29af0 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
29b00 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
29b10 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
29b20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
29b30 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65     ** out to the
29b40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
29b50 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70  but will be drop
29b60 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ped from the cac
29b70 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a  he. Then,.    **
29b80 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
29b90 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
29ba0 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
29bb0 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
29bc0 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ead.    ** data 
29bd0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
29be0 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
29bf0 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
29c00 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
29c10 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
29c20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
29c30 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
29c40 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
29c50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20  OINT sp".    ** 
29c60 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
29c70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
29c80 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
29c90 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
29ca0 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
29cb0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
29cc0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
29cd0 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
29ce0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
29cf0 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
29d00 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
29d10 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63  estored to its c
29d20 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65  urrent value whe
29d30 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
29d40 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a  TO sp" is .    *
29d50 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  * executed..    
29d60 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
29d70 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  (.        rc==SQ
29d80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
29d90 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
29da0 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
29db0 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
29dc0 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
29dd0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
29de0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pPg);.    }.  . 
29df0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
29e00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
29e10 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
29e20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
29e30 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
29e40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29e50 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
29e60 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
29e70 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
29e80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
29e90 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
29ea0 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
29eb0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
29ec0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
29ed0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
29ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29ef0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
29f00 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
29f10 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29f20 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
29f30 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
29f40 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
29f50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
29f60 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
29f70 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a  er, rc); .}.../*
29f80 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
29f90 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
29fa0 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
29fb0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
29fc0 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
29fd0 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
29fe0 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
29ff0 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2a000 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2a010 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2a020 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2a030 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2a040 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2a050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a060 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2a070 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2a080 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2a090 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2a0a0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2a0b0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2a0c0 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2a0d0 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2a0e0 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2a0f0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2a100 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2a110 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2a120 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2a130 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2a140 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2a150 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2a160 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2a170 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2a180 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2a190 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2a1a0 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2a1b0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2a1c0 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2a1d0 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2a1e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2a1f0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2a200 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2a210 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2a220 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2a230 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2a240 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2a250 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2a260 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2a270 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
2a280 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2a290 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2a2a0 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
2a2b0 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
2a2c0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
2a2d0 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
2a2e0 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
2a2f0 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
2a300 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
2a310 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
2a320 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
2a330 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
2a340 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
2a350 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
2a360 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
2a370 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
2a380 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
2a390 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2a3a0 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2a3b0 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2a3c0 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2a3d0 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2a3e0 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2a3f0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2a400 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2a410 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2a420 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2a430 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2a440 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2a450 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2a460 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2a470 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2a480 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2a490 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2a4a0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2a4b0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2a4c0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2a4d0 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2a4e0 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2a4f0 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2a500 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2a510 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2a520 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2a530 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2a540 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2a550 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2a560 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2a570 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2a580 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2a590 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2a5a0 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2a5b0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2a5c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2a5d0 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2a5e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2a5f0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2a600 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a620 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2a630 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2a640 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2a650 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2a660 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2a670 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2a680 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2a690 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2a6a0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2a6b0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2a6c0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2a6d0 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2a6e0 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2a6f0 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2a700 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2a710 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2a720 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2a730 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2a740 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2a750 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2a760 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2a770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a780 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2a790 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2a7a0 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2a7b0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2a7c0 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2a7d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2a7e0 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2a7f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a800 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2a810 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2a820 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
2a830 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2a840 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2a850 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2a860 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2a870 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2a880 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2a890 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2a8a0 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2a8b0 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2a8c0 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2a8d0 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2a8e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2a8f0 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2a900 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2a910 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2a920 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2a930 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2a940 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2a950 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2a960 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2a970 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2a980 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2a990 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2a9a0 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2a9b0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2a9c0 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2a9d0 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2a9e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2a9f0 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2aa00 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2aa10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2aa20 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2aa30 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2aa40 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2aa50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2aa60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2aa70 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2aa80 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2aa90 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2aaa0 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2aab0 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2aac0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2aad0 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2aae0 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2aaf0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2ab00 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2ab10 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
2ab20 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2ab30 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
2ab40 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2ab50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2ab60 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
2ab70 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2ab80 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
2ab90 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
2aba0 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
2abb0 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
2abc0 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
2abd0 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
2abe0 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
2abf0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
2ac00 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
2ac10 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2ac20 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2ac30 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
2ac40 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
2ac50 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
2ac60 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2ac70 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2ac80 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
2ac90 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
2aca0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2acb0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2acc0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2acd0 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
2ace0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2acf0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2ad00 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2ad10 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
2ad20 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2ad30 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
2ad40 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
2ad50 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
2ad60 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e  Pager = 0;..#ifn
2ad70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ad80 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66  MEMORYDB.  if( f
2ad90 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d  lags & PAGER_MEM
2ada0 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62  ORY ){.    memDb
2adb0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46   = 1;.    if( zF
2adc0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2add0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  name[0] ){.     
2ade0 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2adf0 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2ae00 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2ae10 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2ae20 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0  ) return SQL
2ae30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2ae40 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2ae50 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2ae60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2ae70 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2ae80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2ae90 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2aea0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2aeb0 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2aec0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2aed0 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2aee0 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2aef0 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2af00 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2af10 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2af20 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2af30 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2af40 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2af50 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2af60 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2af70 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2af80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2af90 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2afa0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2afb0 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2afc0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2afd0 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2afe0 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2aff0 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2b000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b010 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2b020 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2b030 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2b040 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2b050 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2b060 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2b070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b080 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2b090 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2b0a0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2b0b0 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2b0c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2b0d0 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2b0e0 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2b0f0 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2b100 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2b110 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2b120 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2b130 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2b140 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2b150 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2b160 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2b170 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2b180 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2b190 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2b1a0 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2b1b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b1c0 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2b1d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2b1e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2b1f0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2b200 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2b210 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2b220 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2b230 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2b240 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2b250 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2b260 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2b270 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2b280 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2b290 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2b2a0 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2b2b0 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2b2c0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2b2d0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2b2e0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2b2f0 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2b300 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2b310 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2b320 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2b330 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2b340 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2b350 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2b360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b370 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2b380 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2b390 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2b3a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2b3b0 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2b3c0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2b3d0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2b3e0 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2b3f0 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2b400 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2b410 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2b420 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2b430 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2b440 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2b450 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2b460 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2b470 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b490 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2b4a0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2b4b0 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2b4e0 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2b4f0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2b500 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2b510 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2b520 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2b530 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2b540 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2b550 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2b560 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2b570 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2b580 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2b590 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2b5a0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2b5b0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2b5c0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2b5d0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2b5e0 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2b5f0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2b600 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2b610 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2b620 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2b630 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2b640 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2b650 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2b660 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2b670 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2b680 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2b690 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2b6a0 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2b6b0 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2b6c0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2b6d0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2b6e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2b6f0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2b700 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b710 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2b720 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2b730 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2b740 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2b750 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2b760 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2b770 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2b780 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2b790 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2b7a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2b7b0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2b7c0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2b7d0 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2b7e0 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2b7f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2b800 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2b810 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2b820 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2b830 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2b840 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2b850 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2b860 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2b870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b880 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
2b890 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2b8a0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2b8b0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2b8c0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2b8d0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2b8e0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2b8f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2b900 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2b910 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2b920 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2b930 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2b940 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2b950 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2b960 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2b970 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2b980 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2b990 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2b9a0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2b9b0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b9c0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2b9d0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2b9e0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2b9f0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2ba00 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2ba10 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2ba20 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2ba30 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2ba40 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2ba50 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2ba60 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2ba70 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2ba80 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2ba90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2baa0 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2bab0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2bac0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2bad0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2bae0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2baf0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2bb00 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2bb10 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2bb20 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2bb30 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2bb40 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2bb50 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2bb60 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2bb70 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2bb80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2bb90 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2bba0 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2bbb0 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2bbc0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2bbd0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2bbe0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2bbf0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2bc00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2bc10 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2bc20 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2bc30 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2bc40 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2bc50 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2bc60 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2bc70 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2bc80 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2bc90 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2bca0 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2bcb0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2bcc0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2bcd0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2bce0 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2bcf0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2bd00 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2bd10 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2bd20 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2bd30 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2bd40 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2bd50 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2bd60 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2bd70 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2bd80 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2bd90 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdb0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2bdc0 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2bdd0 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2bde0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2bdf0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2be00 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2be10 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2be20 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2be30 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2be40 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2be50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2be60 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2be70 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2be80 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2be90 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2bea0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2beb0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2bec0 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2bed0 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2bee0 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2bef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf00 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2bf10 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2bf20 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2bf30 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2bf40 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2bf50 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2bf60 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2bf70 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2bf80 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2bf90 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2bfa0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2bfb0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2bfc0 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2bfd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2bfe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bff0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2c000 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
2c010 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2c020 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2c030 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2c040 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2c050 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2c060 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2c070 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2c080 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2c090 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2c0a0 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
2c0b0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2c0c0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
2c0d0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2c0e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2c0f0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2c100 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c110 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2c120 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2c130 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2c140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2c150 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2c160 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2c170 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
2c180 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2c190 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2c1a0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2c1b0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
2c1c0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
2c1d0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2c1e0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2c1f0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2c200 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2c210 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2c220 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2c230 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2c240 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2c250 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2c260 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
2c270 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2c280 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2c290 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2c2a0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2c2b0 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
2c2c0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2c2d0 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
2c2e0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2c2f0 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2c300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c310 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2c320 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2c330 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2c340 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2c350 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2c360 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2c370 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2c380 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2c390 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2c3a0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2c3b0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2c3c0 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2c3d0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2c3e0 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2c3f0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2c400 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2c410 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2c420 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2c430 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2c440 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2c450 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2c460 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2c470 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2c480 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2c490 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2c4a0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2c4b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2c4c0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
2c4d0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2c4e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2c4f0 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
2c500 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2c510 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2c520 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2c530 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2c540 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2c550 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2c560 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2c570 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2c580 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2c590 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2c5a0 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2c5b0 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2c5c0 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2c5d0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2c5e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2c5f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c600 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c610 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2c620 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c630 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2c640 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2c650 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2c660 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2c670 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2c680 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2c690 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  urred in either 
2c6a0 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
2c6b0 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20  ove, free the . 
2c6c0 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   ** Pager struct
2c6d0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2c6e0 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2c6f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c700 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c710 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
2c720 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ce );.    sqlite
2c730 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2c740 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2c750 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2c760 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c770 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2c780 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2c790 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65  bject. */.  asse
2c7a0 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2c7b0 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  );.  nExtra = RO
2c7c0 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
2c7d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2c7e0 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2c7f0 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c810 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2c820 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2c830 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2c840 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47  pPCache);..  PAG
2c850 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2c860 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2c870 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2c880 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2c890 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2c8a0 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2c8b0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2c8c0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2c8d0 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2c8e0 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2c8f0 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67  urnal;.  /* pPag
2c900 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
2c910 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c920 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
2c930 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c940 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
2c950 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
2c960 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2c970 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
2c980 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2c990 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
2c9a0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2c9b0 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
2c9c0 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
2c9d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
2c9e0 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
2c9f0 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  K; */.#if 0.  as
2ca00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2ca10 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
2ca20 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
2ca30 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
2ca40 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  K) );.#endif.  /
2ca50 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
2ca60 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
2ca70 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
2ca80 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
2ca90 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
2caa0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2cab0 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
2cac0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
2cad0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2cae0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
2caf0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2cb00 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2cb10 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
2cb20 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2cb30 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
2cb40 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
2cb50 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2cb60 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2cb70 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
2cb80 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
2cb90 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
2cba0 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
2cbb0 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73  ly;.  assert( us
2cbc0 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
2cbd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2cbe0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
2cbf0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2cc00 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
2cc10 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2cc20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2cc30 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a  >fullSync==0 );.
2cc40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2cc50 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30  er->syncFlags==0
2cc60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2cc70 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2cc80 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2cc90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
2cca0 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  kptSyncFlags==0 
2ccb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ccc0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2ccd0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2cce0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2ccf0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2cd00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2cd10 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2cd20 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2cd30 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2cd40 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2cd50 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2cd60 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2cd70 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2cd80 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2cd90 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2cda0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2cdb0 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2cdc0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2cdd0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2cde0 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2cdf0 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2ce00 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2ce10 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2ce20 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2ce30 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2ce40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2ce50 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2ce60 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2ce70 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2ce80 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2ce90 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2cea0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2ceb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2cec0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2ced0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2cee0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2cef0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2cf00 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2cf10 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2cf20 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2cf30 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2cf40 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2cf50 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2cf60 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2cf70 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  it;.  /* memset(
2cf80 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
2cf90 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
2cfa0 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20  >aHash)); */..  
2cfb0 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
2cfc0 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
2cfd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
2cfe0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2cff0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2d000 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
2d010 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
2d020 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
2d030 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
2d040 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
2d050 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
2d060 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
2d070 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
2d080 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
2d090 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
2d0a0 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
2d0b0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
2d0c0 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
2d0d0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2d0e0 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
2d0f0 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
2d100 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
2d110 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
2d120 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
2d130 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2d140 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2d150 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
2d160 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
2d170 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2d180 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2d190 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2d1a0 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
2d1b0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2d1c0 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
2d1d0 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
2d1e0 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
2d1f0 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
2d200 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
2d210 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2d220 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
2d230 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
2d240 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
2d250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d260 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
2d270 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
2d280 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
2d290 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
2d2a0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
2d2b0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
2d2c0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2d2d0 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
2d2e0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2d2f0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
2d300 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
2d310 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
2d320 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
2d330 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
2d340 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2d350 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2d360 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
2d370 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
2d380 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2d390 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
2d3a0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
2d3b0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
2d3c0 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
2d3d0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
2d3e0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
2d3f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2d400 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2d410 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
2d420 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
2d430 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
2d440 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2d450 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
2d460 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
2d470 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
2d480 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2d490 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2d4a0 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
2d4b0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
2d4c0 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
2d4d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2d4e0 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
2d4f0 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
2d500 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
2d510 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2d520 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
2d530 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2d540 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
2d550 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
2d560 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2d570 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2d580 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2d590 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
2d5a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2d5b0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
2d5c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2d5d0 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
2d5e0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
2d5f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2d600 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
2d610 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
2d620 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2d630 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
2d640 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2d650 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
2d660 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
2d670 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
2d680 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
2d690 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d6a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d6b0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
2d6c0 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
2d6d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d6e0 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
2d6f0 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
2d700 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
2d710 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
2d720 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
2d730 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2d740 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
2d750 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2d760 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
2d770 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2d780 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
2d790 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
2d7a0 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
2d7b0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2d7c0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2d7d0 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
2d7e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
2d7f0 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
2d800 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
2d810 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
2d820 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2d830 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
2d840 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
2d850 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
2d860 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2d870 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
2d880 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2d890 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
2d8a0 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
2d8b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d8c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
2d8d0 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
2d8e0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2d8f0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
2d900 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
2d910 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
2d920 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
2d930 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
2d940 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
2d950 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
2d960 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
2d970 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
2d980 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
2d990 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
2d9a0 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
2d9b0 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
2d9c0 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
2d9d0 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
2d9e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2d9f0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2da00 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
2da10 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
2da20 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
2da30 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2da40 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
2da50 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
2da60 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
2da70 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
2da80 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
2da90 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
2daa0 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
2dab0 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
2dac0 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
2dad0 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
2dae0 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
2daf0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2db00 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2db10 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
2db20 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
2db30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2db40 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
2db50 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2db60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2db70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2db80 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
2db90 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
2dba0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
2dbb0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2dbc0 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
2dbd0 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
2dbe0 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
2dbf0 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
2dc00 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
2dc10 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
2dc20 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
2dc30 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
2dc40 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
2dc50 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
2dc60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
2dc70 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
2dc80 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
2dc90 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
2dca0 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
2dcb0 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
2dcc0 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
2dcd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2dce0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2dcf0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2dd00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2dd10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dd20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
2dd30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2dd40 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
2dd50 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2dd60 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f       if( pagerLo
2dd70 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
2dd80 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
2dd90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dda0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
2ddb0 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
2ddc0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
2ddd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2dde0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
2ddf0 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72  siveMode ) pager
2de00 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
2de10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2de20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2de30 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
2de40 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
2de50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2de60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
2de70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2de80 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
2de90 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
2dea0 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
2deb0 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
2dec0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
2ded0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
2dee0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
2def0 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
2df00 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
2df10 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
2df20 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2df30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2df40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2df50 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
2df60 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
2df70 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
2df80 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
2df90 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
2dfa0 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
2dfb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2dfc0 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
2dfd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dfe0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
2dff0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
2e000 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2e010 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
2e020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2e030 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2e040 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
2e050 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
2e060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2e070 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2e080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e090 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
2e0a0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
2e0b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e0c0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
2e0d0 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
2e0e0 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
2e0f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2e100 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
2e110 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
2e120 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2e130 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2e140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e150 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2e160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e170 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2e180 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2e190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e1a0 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
2e1b0 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20   = (first!=0);. 
2e1c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
2e1d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
2e1e0 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
2e1f0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
2e200 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72  annot open the r
2e210 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2e220 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
2e230 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20   see if.        
2e240 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61      ** its has a
2e250 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68   zero header, th
2e260 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  at might be due 
2e270 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c  to an I/O error,
2e280 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20   or.            
2e290 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  ** it might be d
2e2a0 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63  ue to the race c
2e2b0 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
2e2c0 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a  ed above and in.
2e2d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2e2e0 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69  icket #3883.  Ei
2e2f0 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65  ther way, assume
2e300 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2e310 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20  l is hot..      
2e320 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
2e330 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70  ght be a false p
2e340 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66  ositive.  But if
2e350 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65   it is, then the
2e360 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e370 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61  automatic journa
2e380 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72  l playback and r
2e390 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73  ecovery mechanis
2e3a0 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20  m will deal.    
2e3b0 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
2e3c0 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c  it under an EXCL
2e3d0 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65  USIVE lock where
2e3e0 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
2e3f0 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  to.            *
2e400 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20  * worry so much 
2e410 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74  with race condit
2e420 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20  ions..          
2e430 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2e440 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
2e450 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2e470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e490 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2e4a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2e4b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2e4c0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  d to obtain a sh
2e4d0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
2e4e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2e4f0 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
2e500 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
2e510 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75  PagerAcquire() u
2e520 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
2e530 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
2e540 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
2e550 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
2e560 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
2e570 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
2e580 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
2e590 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
2e5a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2e5b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
2e5c0 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
2e5d0 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
2e5e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2e5f0 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
2e600 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
2e610 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  tly in PAGER_OPE
2e620 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  N state (no lock
2e630 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
2e640 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e650 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
2e660 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2e670 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
2e680 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
2e690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e6a0 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
2e6b0 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
2e6c0 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
2e6d0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
2e6e0 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
2e6f0 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
2e700 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
2e710 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
2e720 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
2e730 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
2e740 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
2e750 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
2e760 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2e770 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
2e780 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
2e790 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
2e7a0 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
2e7b0 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
2e7c0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
2e7d0 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
2e7e0 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
2e7f0 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
2e800 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
2e810 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2e820 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2e830 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
2e840 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
2e850 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
2e860 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2e870 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
2e880 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
2e890 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
2e8a0 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
2e8b0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
2e8c0 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
2e8d0 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
2e8e0 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
2e8f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2e900 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
2e910 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
2e920 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
2e930 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
2e940 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
2e950 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2e960 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2e970 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2e980 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
2e990 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
2e9a0 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
2e9b0 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
2e9c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2e9d0 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  .** rolling back
2e9e0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
2e9f0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2ea00 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
2ea10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2ea20 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
2ea30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ea40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ea50 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2ea60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ea70 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
2ea80 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
2ea90 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
2eaa0 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
2eab0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
2eac0 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
2ead0 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ages. This impli
2eae0 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
2eaf0 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65  r state should e
2eb00 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50  ither.  ** be OP
2eb10 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45  EN or READER. RE
2eb20 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADER is only pos
2eb30 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67  sible if the pag
2eb40 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20  er is or was in 
2eb50 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  .  ** exclusive 
2eb60 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a  access mode..  *
2eb70 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
2eb80 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
2eb90 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2eba0 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  e)==0 );.  asser
2ebb0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2ebc0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2ebd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ebe0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2ebf0 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
2ec00 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
2ec10 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e  EADER );.  if( N
2ec20 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50  EVER(MEMDB && pP
2ec30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2ec40 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  { return pPager-
2ec50 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69  >errCode; }..  i
2ec60 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
2ec70 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
2ec80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2ec90 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74  _OPEN ){.    int
2eca0 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31   bHotJournal = 1
2ecb0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
2ecc0 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
2ecd0 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ts a hot journal
2ece0 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73  -file */..    as
2ecf0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
2ed00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2ed10 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
2ed20 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2ed30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ed40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ed50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ed60 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
2ed70 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
2ed80 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
2ed90 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  );.      goto fa
2eda0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
2edb0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
2edc0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
2edd0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
2ede0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
2edf0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2ee00 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
2ee10 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
2ee20 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
2ee30 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
2ee40 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2ee50 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  r->eLock<=SHARED
2ee60 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
2ee70 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
2ee80 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a  l(pPager, &bHotJ
2ee90 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
2eea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2eeb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
2eec0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
2eed0 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75  .    if( bHotJou
2eee0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
2eef0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
2ef00 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
2ef10 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
2ef20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
2ef30 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
2ef40 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
2ef50 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2ef60 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
2ef70 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
2ef80 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
2ef90 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
2efa0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
2efb0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
2efc0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
2efd0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
2efe0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
2eff0 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
2f000 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
2f010 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
2f020 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
2f030 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
2f040 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
2f050 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
2f060 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
2f070 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
2f080 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
2f090 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
2f0a0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
2f0b0 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
2f0c0 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
2f0d0 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
2f0e0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
2f0f0 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
2f100 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
2f110 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
2f120 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
2f130 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
2f140 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
2f150 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
2f160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f170 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2f180 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   ** Unless the p
2f190 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69  ager is in locki
2f1a0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2f1b0 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  e mode, the lock
2f1c0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77   is.      ** dow
2f1d0 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45  ngraded to SHARE
2f1e0 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68  D_LOCK before th
2f1f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2f200 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rns..      */.  
2f210 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
2f220 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
2f230 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2f240 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f260 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2f270 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2f280 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
2f290 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
2f2a0 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
2f2b0 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
2f2c0 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
2f2d0 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
2f2e0 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
2f2f0 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
2f300 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
2f310 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
2f320 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
2f330 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2f340 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
2f350 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
2f360 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
2f370 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
2f380 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
2f390 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
2f3a0 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
2f3b0 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
2f3c0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
2f3d0 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
2f3e0 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
2f3f0 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
2f400 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
2f410 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
2f420 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
2f430 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2f440 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
2f450 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
2f460 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
2f470 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
2f480 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
2f490 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
2f4a0 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
2f4b0 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
2f4c0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
2f4d0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
2f4e0 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
2f4f0 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
2f500 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
2f510 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
2f520 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
2f530 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
2f540 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
2f550 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
2f560 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
2f570 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
2f580 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
2f590 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
2f5a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f5b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
2f5c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2f5d0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2f5e0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  ->pVfs;.        
2f5f0 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20  int bExists;    
2f600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f610 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
2f620 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
2f630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f640 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
2f650 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
2f660 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2f670 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2f680 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20  TS, &bExists);. 
2f690 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2f6a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
2f6b0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sts ){.         
2f6c0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
2f6d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2f6e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2f6f0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2f700 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
2f710 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2f720 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
2f730 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
2f740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f750 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2f760 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2f770 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
2f780 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
2f790 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2f7a0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
2f7b0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
2f7c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2f7d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
2f7e0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2f7f0 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
2f800 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f810 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2f820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2f830 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2f840 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2f850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f860 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
2f870 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
2f880 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2f890 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
2f8a0 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
2f8b0 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
2f8c0 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
2f8d0 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
2f8e0 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
2f8f0 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
2f900 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
2f910 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
2f920 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
2f930 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
2f940 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
2f950 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
2f960 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f970 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
2f980 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
2f990 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
2f9a0 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
2f9b0 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
2f9c0 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
2f9d0 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
2f9e0 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
2f9f0 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
2fa00 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
2fa10 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
2fa20 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
2fa30 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
2fa40 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
2fa50 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2fa60 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2fa70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2fa80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2fa90 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
2faa0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2fab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fac0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2fad0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
2fae0 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
2faf0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2fb00 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2fb10 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
2fb20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fb30 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
2fb40 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
2fb50 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
2fb60 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
2fb70 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
2fb80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2fb90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fba0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2fbb0 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
2fbc0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2fbd0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
2fbe0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
2fbf0 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
2fc00 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
2fc10 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
2fc20 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
2fc30 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
2fc40 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
2fc50 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
2fc60 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
2fc70 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
2fc80 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
2fc90 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
2fca0 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
2fcb0 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
2fcc0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
2fcd0 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
2fce0 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
2fcf0 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
2fd00 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
2fd10 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
2fd20 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
2fd30 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
2fd40 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2fd50 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
2fd60 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
2fd70 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
2fd80 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
2fd90 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
2fda0 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
2fdb0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
2fdc0 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
2fdd0 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
2fde0 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
2fdf0 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
2fe00 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
2fe10 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
2fe20 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
2fe30 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
2fe40 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
2fe50 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
2fe60 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
2fe70 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
2fe80 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
2fe90 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
2fea0 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
2feb0 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
2fec0 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
2fed0 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
2fee0 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
2fef0 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
2ff00 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
2ff10 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
2ff20 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
2ff30 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
2ff40 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
2ff50 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
2ff60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2ff70 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
2ff80 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
2ff90 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2ffa0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ffb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ffc0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2ffd0 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
2ffe0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
2fff0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
30000 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
30010 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
30020 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
30030 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
30040 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
30050 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
30060 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a  ager->tempFile .
30070 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
30080 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
30090 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
300a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
300b0 68 65 29 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20  he)>0) .    ){. 
300c0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
300d0 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
300e0 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
300f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30100 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
30110 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
30120 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
30130 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
30140 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
30150 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
30160 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
30170 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
30180 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
30190 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
301a0 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
301b0 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
301c0 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
301d0 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
301e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
301f0 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
30200 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
30210 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
30220 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
30230 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
30240 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
30250 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
30260 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
30270 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
30280 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
30290 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
302a0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
302b0 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
302c0 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
302d0 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
302e0 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
302f0 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
30300 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
30310 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
30320 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
30330 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
30340 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
30350 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
30360 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
30370 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
30380 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
30390 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
303a0 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
303b0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
303c0 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
303d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
303e0 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
303f0 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
30400 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
30410 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
30420 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
30430 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
30440 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
30450 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
30460 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
30470 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
30480 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
30490 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
304a0 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
304b0 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
304c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
304d0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
304e0 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
304f0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
30500 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
30510 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30530 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
30540 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30560 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
30570 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
30580 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
30590 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
305a0 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
305b0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
305c0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
305d0 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
305e0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
305f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
30600 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
30610 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
30620 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
30630 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
30640 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
30650 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
30660 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
30670 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
30680 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
30690 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
306a0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
306b0 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
306c0 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
306d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
306e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
306f0 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
30700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
30710 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
30720 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
30730 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
30740 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
30750 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
30760 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
30770 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
30780 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
30790 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
307a0 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
307b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
307c0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
307d0 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
307e0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
307f0 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
30800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30810 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
30820 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
30830 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
30840 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
30850 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30860 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
30870 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
30880 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
30890 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  EADER;.  }.  ret
308a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
308b0 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
308c0 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
308d0 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
308e0 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
308f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
30900 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
30910 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
30920 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
30930 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
30940 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
30950 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
30960 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
30970 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
30980 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
30990 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
309a0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
309b0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
309c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
309d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
309e0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
309f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30a00 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50  .  if( (sqlite3P
30a10 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
30a20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
30a30 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
30a40 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
30a50 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
30a60 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
30a70 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
30a80 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
30a90 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
30aa0 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
30ab0 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
30ac0 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
30ad0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
30ae0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
30af0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
30b00 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
30b10 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
30b20 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
30b30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
30b40 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
30b50 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
30b60 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
30b70 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
30b80 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
30b90 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
30ba0 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
30bb0 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
30bc0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
30bd0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
30be0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
30bf0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
30c00 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
30c10 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
30c20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
30c30 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
30c40 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
30c50 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
30c60 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
30c70 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
30c80 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
30c90 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
30ca0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
30cb0 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
30cc0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
30cd0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
30ce0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
30cf0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
30d00 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
30d10 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
30d20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30d30 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
30d40 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
30d50 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
30d60 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
30d70 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
30d80 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
30d90 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
30da0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
30db0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
30dc0 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
30dd0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
30de0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
30df0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
30e00 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
30e10 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
30e20 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
30e30 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
30e40 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
30e50 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
30e60 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
30e70 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
30e80 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
30e90 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
30ea0 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
30eb0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
30ec0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
30ed0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
30ee0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
30ef0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
30f00 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
30f10 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
30f20 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e  wo seperate scen
30f30 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
30f40 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
30f50 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
30f60 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
30f70 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
30f80 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
30f90 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
30fa0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
30fb0 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
30fc0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
30fd0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
30fe0 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
30ff0 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
31000 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
31010 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
31020 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
31030 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
31040 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
31050 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
31060 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
31070 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
31080 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
31090 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
310a0 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
310b0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
310c0 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
310d0 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
310e0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
310f0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
31100 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
31110 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
31120 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
31130 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
31140 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
31150 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
31160 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
31170 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
31180 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
31190 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
311a0 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
311b0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
311c0 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
311d0 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
311e0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
311f0 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
31200 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
31210 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
31220 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
31230 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
31240 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
31250 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
31260 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
31270 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
31280 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
31290 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
312a0 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
312b0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
312c0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
312d0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
312e0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
312f0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
31300 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
31310 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
31320 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
31330 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
31340 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
31350 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
31360 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
31370 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
31380 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
31390 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
313a0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
313b0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
313c0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
313d0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
313e0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
313f0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
31400 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
31410 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
31420 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
31430 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
31440 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
31450 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
31460 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
31470 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
31480 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
31490 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
314a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
314b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
314c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
314d0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
314e0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
314f0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
31500 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
31510 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
31520 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
31530 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
31540 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
31550 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
31560 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
31570 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
31580 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
31590 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
315a0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
315b0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
315c0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
315d0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
315e0 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
315f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
31600 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
31610 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
31620 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
31630 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
31640 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
31650 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
31660 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
31670 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
31680 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
31690 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
316a0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
316b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
316c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
316d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
316e0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
316f0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
31700 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20  Cache, pgno, 1, 
31710 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ppPage);.  }..  
31720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31730 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
31740 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
31750 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
31760 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
31770 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
31780 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
31790 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
317a0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
317b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
317c0 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
317d0 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
317e0 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
317f0 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
31800 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
31810 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
31820 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
31830 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
31840 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
31850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
31860 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
31870 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61  pPager || (*ppPa
31880 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  ge)->pPager==0 )
31890 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  ;..  if( (*ppPag
318a0 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  e)->pPager && !n
318b0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
318c0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
318d0 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
318e0 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
318f0 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
31900 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
31910 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
31920 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
31930 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
31940 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
31950 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
31960 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
31970 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
31980 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
31990 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
319a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
319b0 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
319c0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
319d0 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
319e0 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
319f0 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
31a00 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
31a10 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20  alized.  */..   
31a20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
31a30 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
31a40 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
31a50 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
31a60 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
31a70 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
31a80 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
31a90 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
31aa0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
31ab0 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
31ac0 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
31ad0 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
31ae0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
31af0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
31b00 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
31b10 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
31b20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31b30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31b40 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
31b50 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
31b60 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   }..    if( MEMD
31b70 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  B || pPager->dbS
31b80 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f  ize<pgno || noCo
31b90 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e  ntent || !isOpen
31ba0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
31bb0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
31bc0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
31bd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31be0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
31bf0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
31c00 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
31c10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
31c20 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
31c30 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
31c40 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
31c50 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
31c60 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
31c70 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
31c80 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
31c90 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
31ca0 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
31cb0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
31cc0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
31cd0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
31ce0 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
31cf0 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
31d00 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
31d10 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
31d20 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
31d30 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
31d40 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
31d50 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
31d60 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
31d70 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
31d80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
31d90 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
31da0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
31db0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
31dc0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
31dd0 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
31de0 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
31df0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
31e00 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
31e10 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
31e20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
31e30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
31e40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31e50 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
31e60 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
31e70 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
31e80 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
31e90 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
31ea0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
31eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
31ec0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
31ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
31ee0 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
31ef0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
31f00 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
31f10 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
31f20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
31f30 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
31f40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31f50 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
31f60 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  er );.      pPag
31f70 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
31f80 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20  STAT_MISS]++;.  
31f90 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
31fa0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
31fb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31fc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
31fd0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
31fe0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
31ff0 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
32000 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
32010 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
32020 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
32030 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
32040 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
32050 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
32060 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
32070 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
32080 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
32090 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
320a0 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
320b0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
320c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
320d0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
320e0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
320f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
32100 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
32110 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
32120 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
32130 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
32140 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
32150 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
32160 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
32170 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
32180 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
32190 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
321a0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
321b0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
321c0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
321d0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
321e0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
321f0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
32200 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
32210 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
32220 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
32230 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
32240 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
32250 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
32260 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
32270 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
32280 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
32290 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
322a0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
322b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
322c0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
322d0 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
322e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
322f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
32300 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
32310 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
32320 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  che!=0 );.  asse
32330 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32340 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
32350 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
32360 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
32370 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
32380 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
32390 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
323a0 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72  , &pPg);.  retur
323b0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
323c0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
323d0 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
323e0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
323f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
32400 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
32410 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
32420 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
32430 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
32440 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
32450 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
32460 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
32470 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
32480 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
32490 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
324a0 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
324b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
324c0 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
324d0 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
324e0 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72  pPg ){.    Pager
324f0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
32500 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
32510 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
32520 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72  (pPg);.    pager
32530 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
32540 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
32550 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
32560 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
32570 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
32580 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
32590 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
325a0 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
325b0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
325c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
325d0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
325e0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
325f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
32600 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
32610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
32620 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
32630 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
32640 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
32650 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
32660 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
32670 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
32680 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
32690 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
326a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
326b0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
326c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
326d0 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
326e0 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
326f0 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
32700 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
32710 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
32720 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
32730 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
32740 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
32750 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
32760 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32770 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
32780 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
32790 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
327a0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
327b0 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
327c0 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
327d0 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
327e0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
327f0 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
32800 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
32810 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
32820 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
32830 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
32840 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
32850 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
32860 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
32870 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
32880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
32890 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
328a0 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
328b0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
328c0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
328d0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
328e0 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
328f0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
32900 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
32910 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
32920 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
32930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32940 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
32950 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
32960 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
32970 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
32980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
32990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
329b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
329c0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
329d0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
329e0 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
329f0 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
32a00 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
32a10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
32a20 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
32a30 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
32a40 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
32a50 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
32a60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
32a70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
32a80 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
32a90 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
32aa0 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
32ab0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
32ac0 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
32ad0 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
32ae0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
32af0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
32b00 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
32b10 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
32b20 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
32b30 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
32b40 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
32b50 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
32b60 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
32b70 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
32b80 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
32b90 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
32ba0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
32bb0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
32bc0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
32bd0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
32be0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
32bf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
32c00 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
32c10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
32c20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
32c30 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
32c40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32c50 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
32c60 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
32c70 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
32c80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
32c90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32ca0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
32cb0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
32cc0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
32cd0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
32ce0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
32cf0 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
32d00 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
32d10 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
32d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32d30 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
32d40 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
32d50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  */.          SQL
32d60 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
32d70 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
32d80 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
32d90 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
32da0 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
32db0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
32dc0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
32dd0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
32de0 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
32df0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
32e00 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
32e10 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69           );.  #i
32e20 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
32e30 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
32e40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32e50 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
32e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
32e70 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32e80 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
32e90 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
32ea0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
32eb0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c          );.  #el
32ec0 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  se.        rc = 
32ed0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
32ee0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
32ef0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
32f00 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  d, flags, 0);.  
32f10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
32f20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
32f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
32f40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32f50 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
32f60 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
32f70 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
32f80 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
32f90 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
32fa0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
32fb0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
32fc0 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
32fd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
32fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32ff0 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
33000 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
33010 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
33020 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
33030 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
33040 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
33050 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
33060 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
33070 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
33080 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
33090 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
330a0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
330b0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
330c0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
330d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
330e0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
330f0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
33100 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
33110 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
33120 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
33130 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
33140 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33150 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
33160 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
33170 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
33180 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
33190 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
331a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
331b0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
331c0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
331d0 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
331e0 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
331f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
33200 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
33210 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
33220 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
33230 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
33240 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
33250 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
33260 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
33270 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
33280 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
33290 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
332a0 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
332b0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
332c0 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
332d0 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
332e0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
332f0 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
33300 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
33310 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
33320 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
33330 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
33340 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
33350 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
33360 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
33370 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
33380 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
33390 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
333a0 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
333b0 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
333c0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
333d0 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
333e0 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
333f0 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
33400 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
33410 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
33420 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
33430 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
33440 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
33450 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
33460 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
33470 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
33480 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
33490 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
334a0 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
334b0 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
334c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
334d0 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
334e0 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
334f0 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
33500 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33510 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
33520 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
33530 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
33540 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
33550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
33560 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
33570 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
33580 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
33590 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
335a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
335b0 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
335c0 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
335d0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
335e0 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
335f0 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
33600 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
33610 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33620 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
33630 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33640 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
33650 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
33660 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
33670 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
33680 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
33690 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
336a0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
336b0 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
336c0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
336d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
336e0 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
336f0 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
33700 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
33710 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
33720 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
33730 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
33740 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
33750 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
33760 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
33770 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
33780 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
33790 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
337a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
337b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
337c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
337d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
337e0 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
337f0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
33800 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
33810 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
33820 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
33830 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
33840 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
33850 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
33860 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
33870 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
33880 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
33890 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
338a0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
338b0 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
338c0 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
338d0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
338e0 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
338f0 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
33900 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
33910 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
33920 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
33930 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
33950 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
33960 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
33970 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
33980 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
33990 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
339a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
339b0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
339c0 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
339d0 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
339e0 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
339f0 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
33a00 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
33a10 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
33a20 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
33a30 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
33a40 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
33a50 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
33a60 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
33a70 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
33a80 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
33a90 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
33aa0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
33ab0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
33ac0 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
33ad0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
33ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
33af0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
33b00 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
33b10 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
33b20 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
33b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33b40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
33b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33b60 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
33b70 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
33b80 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33b90 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
33ba0 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
33bb0 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
33bc0 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
33bd0 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
33be0 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
33bf0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
33c00 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
33c10 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
33c20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
33c30 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
33c40 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
33c50 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
33c60 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
33c70 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
33c80 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
33c90 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
33ca0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
33cb0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
33cc0 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
33cd0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
33ce0 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
33cf0 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
33d00 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
33d10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
33d20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
33d30 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
33d40 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
33d50 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
33d60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
33d70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
33d80 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
33d90 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
33da0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
33db0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
33dc0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
33dd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
33de0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
33df0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
33e00 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
33e10 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
33e20 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
33e30 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
33e40 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
33e50 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
33e60 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
33e70 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33e80 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33e90 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
33ea0 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
33eb0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
33ec0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
33ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33ee0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
33ef0 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
33f00 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
33f10 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
33f20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
33f30 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
33f40 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
33f50 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
33f60 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
33f70 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
33f80 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
33f90 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
33fa0 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
33fb0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
33fc0 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
33fd0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
33fe0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
33ff0 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
34000 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
34010 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
34020 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
34030 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
34040 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
34050 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
34060 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
34070 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
34080 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
34090 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68  ITE_OK;..  /* Th
340a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
340b0 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
340c0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
340d0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
340e0 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74  .  ** been start
340f0 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  ed. The journal 
34100 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
34110 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74  not be open at t
34120 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
34130 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  It is never call
34140 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ed in the ERROR 
34150 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  state..  */.  as
34160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
34170 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34180 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
34190 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
341a0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
341b0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
341c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
341d0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
341e0 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
341f0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
34200 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
34210 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
34220 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
34230 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
34240 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ed, report the s
34250 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61  ame error.  ** a
34260 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c  gain. This shoul
34270 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75  d not happen, bu
34280 74 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76  t the check prov
34290 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e  ides robustness.
342a0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
342b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
342c0 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65   )  return pPage
342d0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
342e0 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  * Higher-level r
342f0 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61  outines never ca
34300 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
34310 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
34320 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c  not.  ** writabl
34330 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e  e.  But check an
34340 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72  yway, just for r
34350 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20  obustness. */.  
34360 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
34370 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65  ->readOnly) ) re
34380 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
34390 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
343a0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  pPg);..  /* The 
343b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
343c0 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e  ds to be opened.
343d0 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
343e0 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65  utines have alre
343f0 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65  ady.  ** obtaine
34400 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
34410 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74  locks to begin t
34420 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
34430 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20  tion, but the.  
34440 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
34450 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
34460 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20  t be open. Open 
34470 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69  it now if this i
34480 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a  s the case..  **
34490 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f  .  ** This is do
344a0 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ne before callin
344b0 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
344c0 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68  akeDirty() on th
344d0 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74  e page. .  ** Ot
344e0 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77  herwise, if it w
344f0 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63  ere done after c
34500 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
34510 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c  acheMakeDirty(),
34520 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72   then.  ** an er
34530 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20  ror might occur 
34540 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f  and the pager wo
34550 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52  uld end up in WR
34560 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
34570 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65  e.  ** with page
34580 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
34590 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  y in the cache..
345a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
345b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
345c0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
345d0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
345e0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
345f0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
34600 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
34610 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
34620 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34630 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
34640 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
34650 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
34660 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
34670 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ager) );..  /* M
34680 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
34690 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
346a0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
346b0 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
346c0 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
346d0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
346e0 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
346f0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
34700 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
34710 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
34720 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
34730 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
34740 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73  e(pPg) ){.    as
34750 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
34760 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
34770 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
34780 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
34790 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
347a0 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
347b0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
347c0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
347d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
347e0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
347f0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
34800 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
34810 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
34820 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
34830 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
34840 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
34850 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
34860 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70  urnal(pPg) && !p
34870 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34880 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
34890 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
348a0 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
348b0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
348c0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
348d0 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28  gSize && isOpen(
348e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
348f0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
34900 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
34910 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20  *pData2;.       
34920 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
34930 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
34940 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
34950 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
34960 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
34970 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
34980 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
34990 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
349a0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
349b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
349c0 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
349d0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
349e0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
349f0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
34a00 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
34a10 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
34a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
34a30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
34a40 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
34a50 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20  lOff );.        
34a60 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
34a70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
34a80 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
34a90 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
34aa0 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
34ab0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
34ac0 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
34ad0 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  2);..        /* 
34ae0 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
34af0 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
34b00 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
34b10 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
34b20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
34b30 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
34b40 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
34b50 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
34b60 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
34b70 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
34b80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34b90 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
34ba0 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
34bb0 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
34bc0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
34bd0 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
34be0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
34bf0 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
34c00 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
34c10 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
34c20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
34c30 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
34c40 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
34c50 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
34c60 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
34c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34c80 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
34c90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
34ca0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
34cb0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
34cc0 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
34cd0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
34ce0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34cf0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
34d00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34d10 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
34d20 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
34d30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34d40 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20  , iOff+4);.     
34d50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34d60 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
34d70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
34d80 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
34d90 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61  r->jfd, iOff+pPa
34da0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
34db0 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
34dc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34dd0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
34de0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
34df0 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
34e00 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
34e10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
34e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
34e30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
34e40 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
34e50 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
34e60 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
34e70 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
34e80 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
34e90 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
34ea0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
34eb0 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
34ec0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
34ed0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
34ee0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
34ef0 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
34f00 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
34f10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
34f20 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
34f30 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
34f40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
34f50 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70  rnalOff += 8 + p
34f60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
34f70 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
34f80 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
34f90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34fa0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
34fb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
34fc0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
34fd0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
34fe0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
34ff0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
35000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
35010 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EM );.        as
35020 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
35030 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
35040 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
35050 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61     rc |= addToSa
35060 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
35070 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
35080 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
350a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
350b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
350c0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EM );.          
350d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
350e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
350f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
35100 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
35110 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
35120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
35130 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
35140 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
35150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
35160 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
35170 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
35180 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
35190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
351a0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
351b0 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
351c0 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
351d0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
351e0 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20  _SYNC)?1:0)));. 
351f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
35200 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
35210 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
35220 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
35230 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
35240 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
35250 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
35260 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
35270 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
35280 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
35290 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
352a0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
352b0 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
352c0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
352d0 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
352e0 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
352f0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
35300 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
35310 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62    */.    if( sub
35320 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
35330 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  g) ){.      rc =
35340 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
35350 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
35360 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
35370 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
35380 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
35390 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
353a0 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
353b0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
353c0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
353d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
353e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
353f0 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
35400 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20  writeable. This 
35410 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
35420 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a  called before .*
35430 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  * making changes
35440 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20   to a page. The 
35450 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63  caller must chec
35460 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  k the return val
35470 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66  ue .** of this f
35480 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63  unction and be c
35490 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68  areful not to ch
354a0 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
354b0 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68  ta unless .** th
354c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
354d0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
354e0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
354f0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
35500 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
35510 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
35520 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
35530 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
35540 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
35550 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
35560 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
35570 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
35580 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
35590 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
355a0 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
355b0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
355c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
355d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
355e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
355f0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
35600 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
35610 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
35620 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
35630 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f  rned.** as appro
35640 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73  priate. Otherwis
35650 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
35660 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
35670 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
35680 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
35690 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
356a0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
356b0 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
356c0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
356d0 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
356e0 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
356f0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
35700 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
35710 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ize);..  assert(
35720 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
35730 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
35740 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
35750 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35760 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
35770 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
35780 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
35790 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
357a0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
357b0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
357c0 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
357d0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
357e0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
357f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
35800 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
35810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35820 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
35830 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
35840 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
35850 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30     int nPage = 0
35860 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
35870 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
35880 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
35890 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
358a0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
358b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
358c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
358d0 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
358e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
358f0 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65  True if any page
35900 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f   has PGHDR_NEED_
35910 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  SYNC */..    /* 
35920 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
35930 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31  cSpill flag to 1
35940 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
35950 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
35960 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e  w.    ** a journ
35970 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  al header to be 
35980 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
35990 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
359a0 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  led by.    ** th
359b0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
359c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
359d0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
359e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
359f0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20  NotSyncSpill==0 
35a00 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
35a10 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b  oNotSyncSpill++;
35a20 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
35a30 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
35a40 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
35a50 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
35a60 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
35a70 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
35a80 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
35a90 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
35aa0 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
35ab0 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
35ac0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
35ad0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
35ae0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
35af0 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
35b00 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
35b10 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
35b20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75  1;..    nPageCou
35b30 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  nt = pPager->dbS
35b40 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50 67  ize;.    if( pPg
35b50 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
35b60 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
35b70 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
35b80 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
35b90 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
35ba0 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
35bb0 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
35bc0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f   nPage = nPageCo
35bd0 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d  unt+1-pg1;.    }
35be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
35bf0 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74  e = nPagePerSect
35c00 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
35c10 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20  sert(nPage>0);. 
35c20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
35c30 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
35c40 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
35c50 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
35c60 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
35c70 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
35c80 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
35c90 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70       Pgno pg = p
35ca0 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48  g1+ii;.      PgH
35cb0 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  dr *pPage;.     
35cc0 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67   if( pg==pPg->pg
35cd0 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69  no || !sqlite3Bi
35ce0 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
35cf0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29  >pInJournal, pg)
35d00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
35d10 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  pg!=PAGER_MJ_PGN
35d20 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
35d30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35d40 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
35d50 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b  er, pg, &pPage);
35d60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
35d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35d80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
35d90 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
35da0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
35db0 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
35dc0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
35dd0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  C ){.           
35de0 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
35df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
35e00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
35e10 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
35e20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
35e30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35e40 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67   }else if( (pPag
35e50 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
35e60 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30  (pPager, pg))!=0
35e70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
35e80 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
35e90 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
35ea0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
35eb0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
35ec0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
35ed0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
35ee0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
35ef0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
35f00 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
35f10 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
35f20 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
35f30 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
35f40 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
35f50 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
35f60 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
35f70 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
35f80 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
35f90 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
35fa0 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
35fb0 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
35fc0 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
35fd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
35fe0 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
35ff0 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
36000 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
36010 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
36020 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
36030 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
36040 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
36050 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
36060 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53  LITE_OK && needS
36070 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
36080 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
36090 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
360a0 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  i<nPage; ii++){.
360b0 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
360c0 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
360d0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
360e0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
360f0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
36100 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73      pPage->flags
36110 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
36120 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  YNC;.          s
36130 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36140 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
36150 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
36160 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
36170 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
36180 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70  pill==1 );.    p
36190 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
361a0 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65  Spill--;.  }else
361b0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
361c0 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  _write(pDbPage);
361d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
361e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
361f0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
36200 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
36210 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
36220 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
36230 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
36240 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
36250 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
36260 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
36270 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
36280 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
36290 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
362a0 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
362b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
362c0 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
362d0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
362e0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
362f0 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  IRTY;.}.#endif..
36300 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
36310 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
36320 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
36330 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
36340 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
36350 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
36360 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61  n on page pPg ba
36370 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
36380 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
36390 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
363a0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
363b0 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  y.  This happens
363c0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
363d0 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  hen.** the page 
363e0 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61  has been added a
363f0 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20  s a leaf of the 
36400 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20  freelist and so 
36410 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e  its.** content n
36420 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73  o longer matters
36430 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
36440 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
36450 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
36460 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
36470 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
36480 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
36490 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65  e is unused. The
364a0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
364b0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
364c0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
364d0 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
364e0 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
364f0 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
36500 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
36510 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65  on can quadruple
36520 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
36530 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f  rge .** DELETE o
36540 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f  perations..*/.vo
36550 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
36560 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a  ontWrite(PgHdr *
36570 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
36580 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36590 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d  ger;.  if( (pPg-
365a0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
365b0 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
365c0 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
365d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
365e0 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
365f0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
36600 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
36610 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
36620 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
36630 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
36640 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
36650 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
36660 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
36670 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  ;.    pager_set_
36680 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
36690 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
366a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
366b0 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
366c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
366d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
366e0 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
366f0 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
36700 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
36710 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
36720 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
36730 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
36740 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65 20  ager file.  The 
36750 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67 65  secondary change
36760 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20 39   counter at.** 9
36770 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65  2 is also update
36780 64 2c 20 61 73 20 69 73 20 74 68 65 20 53 51 4c  d, as is the SQL
36790 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
367a0 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e  er at offset 96.
367b0 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73 20  .**.** But this 
367c0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
367d0 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
367e0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
367f0 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f   is false..** To
36800 20 61 76 6f 69 64 20 65 78 63 65 73 73 20 63 68   avoid excess ch
36810 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 31  urning of page 1
36820 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e 6c  , the update onl
36830 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 0a  y happens once..
36840 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
36850 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
36860 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f 75 74  gecounter() rout
36870 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 61 6e  ine that does an
36880 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e   .** uncondition
36890 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74 68 65  al update of the
368a0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 73   change counters
368b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
368c0 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
368d0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
368e0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
368f0 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
36900 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
36910 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
36920 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
36930 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
36940 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
36950 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
36960 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
36970 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
36980 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
36990 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
369a0 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
369b0 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f  tMode flag may o
369c0 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  nly be non-zero 
369d0 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77  if the library w
369e0 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77  as compiled.** w
369f0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45  ith the SQLITE_E
36a00 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
36a10 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  TE macro defined
36a20 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
36a30 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69  ** if isDirect i
36a40 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
36a50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36a60 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69  le is updated di
36a70 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69  rectly.** by wri
36a80 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20  ting an updated 
36a90 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
36aa0 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  1 using a call t
36ab0 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  o the .** sqlite
36ac0 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74  3OsWrite() funct
36ad0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
36ae0 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
36af0 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
36b00 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
36b10 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20  sDirectMode){.  
36b20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36b30 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
36b40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36b50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
36b60 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
36b70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36b80 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
36b90 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
36ba0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
36bb0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
36bc0 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64    /* Declare and
36bd0 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73   initialize cons
36be0 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73  tant integer 'is
36bf0 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a  Direct'. If the.
36c00 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74    ** atomic-writ
36c10 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
36c20 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69  s enabled in thi
36c30 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73  s build, then is
36c40 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69  Direct.  ** is i
36c50 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
36c60 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
36c70 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  s the isDirectMo
36c80 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  de parameter.  *
36c90 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
36ca0 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  on. Otherwise, i
36cb0 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  t is always set 
36cc0 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
36cd0 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
36ce0 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69  hat if the atomi
36cf0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
36d00 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  tion is not.  **
36d10 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
36d20 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f  ile time, the co
36d30 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20  mpiler can omit 
36d40 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a  the tests of.  *
36d50 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c  * 'isDirect' bel
36d60 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74  ow, as well as t
36d70 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65  he block enclose
36d80 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69  d in the.  ** "i
36d90 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63  f( isDirect )" c
36da0 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  ondition..  */.#
36db0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
36dc0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
36dd0 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  E.# define DIREC
36de0 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72  T_MODE 0.  asser
36df0 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d  t( isDirectMode=
36e00 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
36e10 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63  ARAMETER(isDirec
36e20 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20  tMode);.#else.# 
36e30 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
36e40 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a  DE isDirectMode.
36e50 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70  #endif..  if( !p
36e60 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
36e70 6e 74 44 6f 6e 65 20 26 26 20 41 4c 57 41 59 53  ntDone && ALWAYS
36e80 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e  (pPager->dbSize>
36e90 30 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  0) ){.    PgHdr 
36ea0 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20  *pPgHdr;        
36eb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
36ec0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
36ed0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
36ee0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
36ef0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
36f00 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f  r->fd) );..    /
36f10 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
36f20 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
36f30 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
36f40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
36f50 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
36f60 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65  PgHdr);.    asse
36f70 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c  rt( pPgHdr==0 ||
36f80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36f90 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67  ;..    /* If pag
36fa0 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65  e one was fetche
36fb0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
36fc0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
36fd0 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  n is not.    ** 
36fe0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72  operating in dir
36ff0 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70  ect-mode, make p
37000 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20  age 1 writable. 
37010 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20   When not in .  
37020 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65    ** direct mode
37030 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61  , page 1 is alwa
37040 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  ys held in cache
37050 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50   and hence the P
37060 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a  agerGet().    **
37070 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73   above is always
37080 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65   successful - he
37090 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f  nce the ALWAYS o
370a0 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e  n rc==SQLITE_OK.
370b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
370c0 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20  !DIRECT_MODE && 
370d0 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54  ALWAYS(rc==SQLIT
370e0 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  E_OK) ){.      r
370f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37100 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
37110 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
37120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37130 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 6c 79       /* Actually
37140 20 64 6f 20 74 68 65 20 75 70 64 61 74 65 20 6f   do the update o
37150 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  f the change cou
37160 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 61  nter */.      pa
37170 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
37180 63 6f 75 6e 74 65 72 28 70 50 67 48 64 72 29 3b  counter(pPgHdr);
37190 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75  ..      /* If ru
371a0 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20  nning in direct 
371b0 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
371c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
371d0 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   1 to the file. 
371e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52  */.      if( DIR
371f0 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20  ECT_MODE ){.    
37200 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
37210 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61 73  zBuf;.        as
37220 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
37230 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20  FileSize>0 );.  
37240 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
37250 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44 61  ger, pPgHdr->pDa
37260 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51 4c  ta, 1, 6, rc=SQL
37270 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29  ITE_NOMEM, zBuf)
37280 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
372a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
372b0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
372c0 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
372d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
372e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
372f0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
37300 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
37310 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37340 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
37350 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
37360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
37380 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
37390 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ntDone = 1;.    
373a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
373b0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
373c0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
373d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
373e0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
373f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
37410 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37420 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69   to disk. This i
37430 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e  s a no-op for in
37440 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
37450 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
37460 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
37470 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
37480 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
37490 6c 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20  l, or if called 
374a0 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77  on a pager for w
374b0 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d  hich it is a no-
374c0 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  op, this.** func
374d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
374e0 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
374f0 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  e, an IO error c
37500 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
37510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
37520 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
37530 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
37540 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37550 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
37560 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
37570 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
37580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
37590 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
375a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
375b0 67 73 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  gs);.  }else if(
375c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
375d0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
375e0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
375f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
37600 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
37610 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
37620 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44  NTL_SYNC_OMITTED
37630 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
37640 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
37650 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
37660 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
37670 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
37690 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
376a0 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c  y be called whil
376b0 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  e a write-transa
376c0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
376d0 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20  in.** rollback. 
376e0 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
376f0 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  n is in WAL mode
37700 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  , this call is a
37710 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65   no-op. .** Othe
37720 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
37730 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nnection does no
37740 74 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  t already have a
37750 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
37760 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61   on .** the data
37770 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74  base file, an at
37780 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
37790 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a   obtain one..**.
377a0 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55 53  ** If the EXCLUS
377b0 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  IVE lock is alre
377c0 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20  ady held or the 
377d0 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
377e0 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65  n it is.** succe
377f0 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f  ssful, or the co
37800 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57  nnection is in W
37810 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f  AL mode, SQLITE_
37820 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
37830 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69  ** Otherwise, ei
37840 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59  ther SQLITE_BUSY
37850 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f   or an SQLITE_IO
37860 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
37870 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
37880 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
37890 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
378a0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
378b0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
378c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
378d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
378e0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
378f0 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20  R_CACHEMOD .    
37900 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37910 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37920 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20  ER_DBMOD .      
37930 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37940 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37950 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20  _LOCKED .  );.  
37960 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37970 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37980 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70  r) );.  if( 0==p
37990 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
379a0 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  r) ){.    rc = p
379b0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
379c0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
379d0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20  IVE_LOCK);.  }. 
379e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
379f0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
37a00 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
37a10 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
37a20 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
37a30 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
37a40 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
37a50 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
37a60 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
37a70 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
37a80 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
37a90 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
37aa0 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
37ab0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
37ac0 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
37ad0 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
37ae0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
37af0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
37b00 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
37b10 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
37b20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
37b30 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
37b40 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
37b50 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
37b60 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
37b70 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
37b80 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
37b90 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
37ba0 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
37bb0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
37bc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
37bd0 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
37be0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37bf0 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
37c00 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
37c10 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
37c20 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
37c30 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
37c40 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
37c50 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
37c60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
37c70 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
37c80 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
37c90 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
37ca0 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
37cb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
37cc0 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
37cd0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
37ce0 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
37cf0 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
37d00 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
37d10 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
37d20 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
37d30 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
37d40 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
37d50 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
37d60 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
37d70 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
37d80 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
37d90 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
37da0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
37db0 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
37dc0 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
37dd0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
37de0 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
37df0 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
37e00 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
37e10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37e20 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
37e30 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
37e40 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
37e50 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
37e60 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
37e70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37e80 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
37e90 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
37ea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37eb0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
37ec0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
37ed0 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
37ee0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
37ef0 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
37f00 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
37f10 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
37f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
37f40 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
37f50 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
37f60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
37f70 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
37f80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
37f90 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
37fa0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37fb0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37fc0 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
37fd0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37fe0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
37ff0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
38000 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
38010 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
38020 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
38030 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
38040 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20  GER_ERROR.  );. 
38050 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
38060 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
38070 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
38080 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
38090 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74  curred, report t
380a0 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e  hat error again.
380b0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
380c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
380d0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
380e0 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41  ->errCode;..  PA
380f0 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
38100 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
38110 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
38120 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
38130 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
38140 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
38150 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
38160 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62    /* If no datab
38170 61 73 65 20 63 68 61 6e 67 65 73 20 68 61 76 65  ase changes have
38180 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75   been made, retu
38190 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69  rn early. */.  i
381a0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
381b0 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e<PAGER_WRITER_C
381c0 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e  ACHEMOD ) return
381d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
381e0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
381f0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
38200 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
38210 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
38220 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
38230 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   or this.    ** 
38240 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
38250 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
38260 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61  , it is mostly a
38270 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72   no-op.  However
38280 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63  , any.    ** bac
38290 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20  kup in progress 
382a0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
382b0 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  arted..    */.  
382c0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
382d0 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
382e0 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65  Backup);.  }else
382f0 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  {.    if( pagerU
38300 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
38310 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c  .      PgHdr *pL
38320 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
38330 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
38340 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
38350 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
38360 65 4f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  eOne = 0;.      
38370 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
38380 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
38390 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
383a0 65 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 57  e page for the W
383b0 41 4c 20 63 6f 6d 6d 69 74 20 66 6c 61 67 2e 0a  AL commit flag..
383c0 20 20 20 20 20 20 20 20 2a 2a 20 54 69 63 6b 65          ** Ticke
383d0 74 20 5b 32 64 31 61 35 63 36 37 64 66 63 32 33  t [2d1a5c67dfc23
383e0 36 33 65 34 34 66 32 39 64 39 62 62 64 35 37 66  63e44f29d9bbd57f
383f0 5d 20 32 30 31 31 2d 30 35 2d 31 38 20 2a 2f 0a  ] 2011-05-18 */.
38400 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
38410 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
38420 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 4f 6e  ger, 1, &pPageOn
38430 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  e);.        pLis
38440 74 20 3d 20 70 50 61 67 65 4f 6e 65 3b 0a 20 20  t = pPageOne;.  
38450 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 44 69        pList->pDi
38460 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rty = 0;.      }
38470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
38480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
38490 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
384a0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
384b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
384c0 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
384d0 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62  List, pPager->db
384e0 53 69 7a 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Size, 1);.      
384f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
38500 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 4f  agerUnref(pPageO
38510 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ne);.      if( r
38520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
38530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
38540 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
38550 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
38560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
38570 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
38580 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
38590 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
385a0 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63  ge-counter. Exac
385b0 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20  tly how it.     
385c0 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65   ** does this de
385d0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
385e0 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
385f0 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
38600 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  zation.      ** 
38610 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
38620 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64  ompile time, and
38630 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   if this transac
38640 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a  tion meets the .
38650 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65        ** runtime
38660 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
38670 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
38680 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
38690 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65  **    * The file
386a0 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
386b0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
386c0 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
386d0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f       **      blo
386e0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
386f0 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
38700 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
38710 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
38720 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
38730 65 20 74 72 61