/ Hex Artifact Content
Login

Artifact e381c118b77dc22021a1a59d3fec24815e91df78:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
7100: 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75  l if true */.  u
7110: 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20  8 fullSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
7130: 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20   extra syncs of 
7140: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
7150: 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20  robustness */.  
7160: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7170: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7180: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
7190: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
71a0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
71b0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
71d0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
71e0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
71f0: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7200: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7210: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7220: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7230: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7240: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7260: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7270: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
7280: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72a0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
72b0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
72c0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72e0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
72f0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
7300: 2f 0a 0a 20 20 2f 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 2a 2a 2a 2a  ****************
7350: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7360: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7370: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7380: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7390: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
73a0: 6f 75 74 69 6e 65 20 6f 70 65 72 74 69 6f 6e 2e  outine opertion.
73b0: 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73 20    Class members 
73c0: 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  not in this bloc
73d0: 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69 78  k are either fix
73e0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  ed.  ** when the
73f0: 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74 20   pager is first 
7400: 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65 20  created or else 
7410: 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65 6e  only change when
7420: 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a 2a   there is a.  **
7430: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f 64   significant mod
7440: 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20 61  e change (such a
7450: 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 70  s changing the p
7460: 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e  age_size, lockin
7470: 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72 20  g_mode,.  ** or 
7480: 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
7490: 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  ).  From another
74a0: 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c 61   view, these cla
74b0: 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72  ss members descr
74c0: 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73 74  ibe.  ** the "st
74d0: 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67 65  ate" of the page
74e0: 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20 63  r, while other c
74f0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73  lass members des
7500: 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20 22  cribe the.  ** "
7510: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 6f  configuration" o
7520: 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  f the pager..  *
7530: 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20 20  /.  u8 eState;  
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20 28  /* Pager state (
7560: 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57 52  OPEN, READER, WR
7570: 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a  ITER_LOCKED..) *
7580: 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20  /.  u8 eLock;   
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20  /* Current lock 
75b0: 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73 65  held on database
75c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 68   file */.  u8 ch
75d0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
75e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
75f0: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
7600: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
7610: 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  ter */.  u8 setM
7620: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
7630: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7640: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
7650: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
7660: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
7670: 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20  tSpill;         
7680: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7690: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 77  pill the cache w
76a0: 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  hen non-zero */.
76b0: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53 70    u8 doNotSyncSp
76c0: 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ill;          /*
76d0: 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70 69   Do not do a spi
76e0: 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ll that requires
76f0: 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20 20   jrnl sync */.  
7700: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
7710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7720: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
7730: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
7740: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
7750: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7770: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7780: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
7790: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
77a0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
77b0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
77c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
77d0: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
77e0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
7800: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
7810: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
7820: 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20 20  no dbHintSize;  
7830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
7840: 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43 4e  ue passed to FCN
7850: 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c  TL_SIZE_HINT cal
7860: 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  l */.  int errCo
7870: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
7880: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
7890: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
78a0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rors */.  int nR
78b0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
78c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a        /* Pages j
78d0: 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20  ournalled since 
78e0: 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72  last j-header wr
78f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63  itten */.  u32 c
7900: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
7910: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
7920: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
7930: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
7940: 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53  ksum */.  u32 nS
7950: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
7960: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7970: 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 74  of records writt
7980: 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61  en to sub-journa
7990: 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  l */.  Bitvec *p
79a0: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
79b0: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
79c0: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
79d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
79e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
79f0: 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20  le *fd;         
7a00: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a10: 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73  ptor for databas
7a20: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7a30: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
7a40: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a50: 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a  iptor for main j
7a60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
7a70: 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20  te3_file *sjfd; 
7a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a90: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73  descriptor for s
7aa0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7ab0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7ad0: 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66  urrent write off
7ae0: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
7af0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
7b00: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
7b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7b20: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
7b30: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
7b40: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
7b50: 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
7b60: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7b70: 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e  o list of ongoin
7b80: 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  g backup process
7b90: 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  es */.  PagerSav
7ba0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
7bb0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
7bc0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
7bd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
7be0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
7bf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7c00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
7c10: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68  epoint[] */.  ch
7c20: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7c30: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7c40: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7c50: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7c60: 67 65 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ges */.  /*.  **
7c70: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7c80: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7c90: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass 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 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7cf0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7d10: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7d20: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7d30: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7d40: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
7d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7d60: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
7d70: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
7d80: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
7d90: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
7da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
7db0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
7dc0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
7dd0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
7de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
7df0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
7e00: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
7e10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7e40: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
7e50: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e70: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
7e80: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
7e90: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
7ea0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
7eb0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
7ec0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
7ed0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
7ee0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
7ef0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
7f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7f20: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
7f30: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7f40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7f50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7f60: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
7f70: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
7f80: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
7f90: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
7fa0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
7fb0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
7fc0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
7fd0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
7fe0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
7ff0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
8000: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8010: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
8020: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
8030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8040: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8070: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8080: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8090: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
80a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
80b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
80c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
80d0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
80e0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
80f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8100: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8110: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8120: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8130: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8140: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8150: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8160: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8170: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8180: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8190: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
81a0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
81b0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
81c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
81d0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
81e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
81f0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8200: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8210: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8220: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8230: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8240: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8250: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8260: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8270: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8280: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8290: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
82a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
82b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
82c0: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
82d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
82e0: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
82f0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8300: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8310: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8320: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8330: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8340: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8350: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8360: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8370: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8380: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8390: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
83a0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
83b0: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
83c0: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
83d0: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
83e0: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
83f0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
8400: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
8410: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
8420: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
8430: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
8440: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8450: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8460: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8470: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8480: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8490: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
84a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
84b0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
84c0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
84d0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
84e0: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
84f0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
8500: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
8510: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
8520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8530: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
8540: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8550: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8560: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8570: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8580: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8590: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
85a0: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
85b0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
85c0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
85d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
85e0: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
85f0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8600: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
8610: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
8620: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
8630: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
8640: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8650: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8660: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8670: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8680: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8690: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
86a0: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
86b0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
86c0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
86d0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
86e0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
86f0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
8700: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
8710: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8720: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
8730: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
8740: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8750: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8760: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8770: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8780: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8790: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
87a0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
87b0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
87c0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
87d0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
87e0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
87f0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8800: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8810: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8820: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8830: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8840: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8850: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8860: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8870: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8880: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8890: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
88a0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
88b0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
88c0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
88d0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
88e0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
88f0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8900: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8910: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8920: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8930: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8940: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8950: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8960: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8970: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8980: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8990: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
89a0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
89b0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
89c0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
89d0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
89e0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
89f0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8a00: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8a10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8a20: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8a30: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8a40: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8a50: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8a60: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8a70: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8a80: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8a90: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8aa0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8ab0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8ac0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8ad0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8ae0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8af0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8b00: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8b10: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8b20: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8b30: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8b40: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8b50: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8b60: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8b70: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8b80: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8b90: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8ba0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8bb0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8bc0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8bd0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8be0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8bf0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
8c00: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
8c10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
8c20: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
8c30: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
8c40: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
8c50: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
8c60: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
8c70: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
8c80: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8c90: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
8ca0: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
8cb0: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
8cc0: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
8cd0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
8ce0: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
8cf0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
8d00: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
8d10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
8d20: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
8d30: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
8d40: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
8d50: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
8d60: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
8d70: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
8d80: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
8d90: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
8da0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
8db0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
8dc0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
8dd0: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
8de0: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
8df0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
8e00: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
8e10: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
8e20: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
8e30: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
8e40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
8e50: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
8e60: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
8e70: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
8e80: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
8e90: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
8ea0: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
8eb0: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
8ec0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
8ed0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
8ee0: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
8ef0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
8f00: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
8f10: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
8f20: 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33  or (type sqlite3
8f30: 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75  _file*)..** Retu
8f40: 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f  rn 0 if it is no
8f50: 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a  t open, or non-z
8f60: 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20  ero (but not 1) 
8f70: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
8f80: 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  This is so that 
8f90: 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20  expressions can 
8fa0: 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a  be written as:.*
8fb0: 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65  *.**   if( isOpe
8fc0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
8fd0: 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74  { ....**.** inst
8fe0: 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69  ead of.**.**   i
8ff0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  f( pPager->jfd->
9000: 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a  pMethods ){ ....
9010: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65  */.#define isOpe
9020: 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70  n(pFd) ((pFd)->p
9030: 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20  Methods)../*.** 
9040: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
9050: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
9060: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
9070: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
9080: 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63  usual.** rollbac
9090: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72  k journal. Other
90a0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
90b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
90c0: 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e  IT_WAL.static in
90d0: 74 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61  t pagerUseWal(Pa
90e0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
90f0: 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e  return (pPager->
9100: 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73  pWal!=0);.}.#els
9110: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
9120: 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65  UseWal(x) 0.# de
9130: 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61  fine pagerRollba
9140: 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  ckWal(x) 0.# def
9150: 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d  ine pagerWalFram
9160: 65 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20  es(v,w,x,y) 0.# 
9170: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
9180: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
9190: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
91a0: 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  ne pagerBeginRea
91b0: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20  dTransaction(z) 
91c0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
91d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
91e0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
91f0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
9200: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
9210: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a  e(pPager) );.**.
9220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9230: 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72   runs many asser
9240: 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e  ts to try to fin
9250: 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65  d inconsistencie
9260: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65  s in.** the inte
9270: 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
9280: 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a  e Pager object..
9290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73  */.static int as
92a0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
92b0: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61  (Pager *p){.  Pa
92c0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b  ger *pPager = p;
92d0: 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73  ..  /* State mus
92e0: 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  t be valid. */. 
92f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9300: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20  te==PAGER_OPEN. 
9310: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9320: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
9330: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9340: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9350: 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
9360: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9370: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
9380: 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
9390: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
93a0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20  WRITER_DBMOD.   
93b0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
93c0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
93d0: 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c  INISHED.       |
93e0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
93f0: 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20  ER_ERROR.  );.. 
9400: 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f   /* Regardless o
9410: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
9420: 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65  ate, a temp-file
9430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61   connection alwa
9440: 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20  ys behaves.  ** 
9450: 61 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20  as if it has an 
9460: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
9470: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
9480: 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70  ile. It never up
9490: 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63  dates.  ** the c
94a0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
94b0: 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e  eld, so the chan
94c0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
94d0: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a   is always set..
94e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
94f0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9500: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9510: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  SIVE_LOCK );.  a
9520: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9530: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
9540: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9550: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9560: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67   useJournal flag
9570: 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a   is clear, the j
9580: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74  ournal-mode must
9590: 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a   be "OFF". .  **
95a0: 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72   And if the jour
95b0: 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46  nal-mode is "OFF
95c0: 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ", the journal f
95d0: 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ile must not be 
95e0: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  open..  */.  ass
95f0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9600: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9610: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d  ALMODE_OFF || p-
9620: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
9630: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9640: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
9650: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9660: 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  | !isOpen(p->jfd
9670: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
9680: 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c   that MEMDB impl
9690: 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20  ies noSync. And 
96a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
96b0: 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a  rnal. Since .  *
96c0: 2a 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20  * this means an 
96d0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
96e0: 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61  performs no IO a
96f0: 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74  t all, it cannot
9700: 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a   encounter .  **
9710: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
9720: 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46  OERR or SQLITE_F
9730: 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ULL during rollb
9740: 61 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e  ack or while fin
9750: 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20  alizing .  ** a 
9760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61  journal file. (a
9770: 6c 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d  lthough the in-m
9780: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d  emory journal im
9790: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
97a0: 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51   .  ** return SQ
97b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
97c0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
97d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
97e0: 20 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20   written). It . 
97f0: 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65   ** is therefore
9800: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
9810: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r an in-memory p
9820: 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
9830: 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74  e ERROR .  ** st
9840: 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ate..  */.  if( 
9850: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
9860: 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29  ert( p->noSync )
9870: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
9880: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9890: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
98a0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  OFF .         ||
98b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
98c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
98d0: 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29  DE_MEMORY .    )
98e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
98f0: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
9900: 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74  RROR && p->eStat
9910: 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e!=PAGER_OPEN );
9920: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
9930: 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29  erUseWal(p)==0 )
9940: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  ;.  }..  /* If c
9950: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69  hangeCountDone i
9960: 73 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45  s set, a RESERVE
9970: 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  D lock or greate
9980: 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20  r must be held. 
9990: 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e   ** on the file.
99a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
99b0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
99c0: 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50  untDone==0 || pP
99d0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  ager->eLock>=RES
99e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
99f0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9a00: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
9a10: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ;..  switch( p->
9a20: 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  eState ){.    ca
9a30: 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20  se PAGER_OPEN:. 
9a40: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
9a50: 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73  MDB );.      ass
9a60: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9a70: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9a80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9a90: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
9aa0: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
9ab0: 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50  PCache)==0 || pP
9ac0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
9ad0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
9ae0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52      case PAGER_R
9af0: 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73  EADER:.      ass
9b00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9b10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9b20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9b30: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9b40: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9b50: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9b60: 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
9b70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
9b80: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
9b90: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20  RITER_LOCKED:.  
9ba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9bb0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
9bc0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
9bd0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9be0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9bf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
9c00: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
9c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
9c20: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45  rt( p->eLock>=RE
9c30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
9c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9c50: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
9c60: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ize==pPager->dbO
9c70: 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  rigSize );.     
9c80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9c90: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9ca0: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
9cb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9cc0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9cd0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
9ce0: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
9cf0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d00: 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
9d10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9d20: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9d30: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20  ITER_CACHEMOD:. 
9d40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9d50: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9d60: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9d70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9d80: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9d90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61  );.      if( !pa
9da0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
9db0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9dc0: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
9dd0: 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d  hat if journal_m
9de0: 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61  ode=wal here tha
9df0: 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20  t neither the.  
9e00: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
9e10: 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41   file nor the WA
9e20: 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e  L file are open.
9e30: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75   This happens du
9e40: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
9e50: 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  a rollback trans
9e60: 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74  action that swit
9e70: 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ches from journa
9e80: 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20  l_mode=off.     
9e90: 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c     ** to journal
9ea0: 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20  _mode=wal..     
9eb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
9ec0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9ed0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9ee0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9ef0: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
9f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
9f10: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9f20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9f30: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
9f40: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9f50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9f60: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
9f70: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
9f80: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9f90: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9fa0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
9fb0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
9fc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9fd0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
9fe0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
9ff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a000: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a010: 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20  RITER_DBMOD:.   
a020: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a030: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a040: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a050: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a060: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a070: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a080: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a090: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
a0a0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a0b0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a0c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a0d0: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a0f0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a100: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a110: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a120: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a130: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a140: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a150: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a160: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a170: 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Size<=pPager->db
a180: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a190: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1a0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a1b0: 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20  FINISHED:.      
a1c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a1d0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a1e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1f0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a200: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a220: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a230: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a240: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a250: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a260: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a270: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a280: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a290: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a2a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a2b0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a2c0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65      );.      bre
a2d0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a2e0: 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  GER_ERROR:.     
a2f0: 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62   /* There must b
a300: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
a310: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
a320: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
a330: 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  r if.      ** in
a340: 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
a350: 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65  herwise the page
a360: 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  r should have al
a370: 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20  ready dropped.  
a380: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f      ** back to O
a390: 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20  PEN state..     
a3a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a3b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a3c0: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
a3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a3e0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
a3f0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
a400: 63 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20  che)>0 );.      
a410: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
a420: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
a430: 20 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55   /* ifndef NDEBU
a440: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
a450: 49 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ITE_DEBUG ./*.**
a460: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
a470: 72 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61  r to a human rea
a480: 64 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20  dable string in 
a490: 61 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a  a static buffer.
a4a0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
a4b0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  e state of the P
a4c0: 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
a4d0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
a4e0: 74 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e  t. This.** is in
a4f0: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
a500: 64 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65  d within debugge
a510: 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
a520: 20 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69   as an alternati
a530: 76 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20  ve.** to "print 
a540: 2a 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a  *pPager" in gdb:
a550: 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69  .**.** (gdb) pri
a560: 6e 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f  ntf "%s", print_
a570: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
a580: 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  er).*/.static ch
a590: 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f  ar *print_pager_
a5a0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
a5b0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
a5c0: 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71  Ret[1024];..  sq
a5d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
a5e0: 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20  024, zRet,.     
a5f0: 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20   "Filename:     
a600: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74   %s\n".      "St
a610: 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20  ate:         %s 
a620: 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20  errCode=%d\n".  
a630: 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20      "Lock:      
a640: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
a650: 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20  "Locking mode:  
a660: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c  locking_mode=%s\
a670: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
a680: 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c  l mode:  journal
a690: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
a6a0: 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65    "Backing store
a6b0: 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65  : tempFile=%d me
a6c0: 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61  mDb=%d useJourna
a6d0: 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a  l=%d\n".      "J
a6e0: 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f  ournal:       jo
a6f0: 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f  urnalOff=%lld jo
a700: 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22  urnalHdr=%lld\n"
a710: 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20  .      "Size:   
a720: 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64         dbsize=%d
a730: 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64   dbOrigSize=%d d
a740: 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a  bFileSize=%d\n".
a750: 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65        , p->zFile
a760: 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  name.      , p->
a770: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
a780: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20  EN            ? 
a790: 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20  "OPEN" :.       
a7a0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a7b0: 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20  R_READER        
a7c0: 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20    ? "READER" :. 
a7d0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a7e0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
a7f0: 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45  OCKED   ? "WRITE
a800: 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20  R_LOCKED" :.    
a810: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a820: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a830: 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43  EMOD ? "WRITER_C
a840: 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20  ACHEMOD" :.     
a850: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a860: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
a870: 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42      ? "WRITER_DB
a880: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a890: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a8a0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
a8b0: 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ? "WRITER_FINISH
a8c0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a8d0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
a8e0: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f  RROR           ?
a8f0: 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72   "ERROR" : "?err
a900: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
a910: 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  t)p->errCode.   
a920: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
a930: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
a940: 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20   "NO_LOCK" :.   
a950: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52       p->eLock==R
a960: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f  ESERVED_LOCK   ?
a970: 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20   "RESERVED" :.  
a980: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
a990: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
a9a0: 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a  ? "EXCLUSIVE" :.
a9b0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
a9c0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  ==SHARED_LOCK   
a9d0: 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20    ? "SHARED" :. 
a9e0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
a9f0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20  =UNKNOWN_LOCK   
aa00: 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22   ? "UNKNOWN" : "
aa10: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
aa20: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
aa30: 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20  e ? "exclusive" 
aa40: 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20  : "normal".     
aa50: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64   , p->journalMod
aa60: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aa70: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20  MODE_MEMORY   ? 
aa80: 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20  "memory" :.     
aa90: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
aaa0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aab0: 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20  MODE_OFF      ? 
aac0: 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20  "off" :.        
aad0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aae0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aaf0: 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65  E_DELETE   ? "de
ab00: 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  lete" :.        
ab10: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
ab20: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ab30: 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65  E_PERSIST  ? "pe
ab40: 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20  rsist" :.       
ab50: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
ab60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ab70: 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74  DE_TRUNCATE ? "t
ab80: 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20  runcate" :.     
ab90: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
aba0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
abb0: 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20  MODE_WAL      ? 
abc0: 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f  "wal" : "?error?
abd0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
abe0: 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74  ->tempFile, (int
abf0: 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29  )p->memDb, (int)
ac00: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  p->useJournal.  
ac10: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
ac20: 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48  Off, p->journalH
ac30: 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  dr.      , (int)
ac40: 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29  p->dbSize, (int)
ac50: 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28  p->dbOrigSize, (
ac60: 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a  int)p->dbFileSiz
ac70: 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e.  );..  return
ac80: 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
ac90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
aca0: 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65  ue if it is nece
acb0: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70  ssary to write p
acc0: 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68  age *pPg into th
acd0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a  e sub-journal..*
ace0: 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74  * A page needs t
acf0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
ad00: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
ad10: 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  l if there exist
ad20: 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  s one.** or more
ad30: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
ad40: 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a   for which:.**.*
ad50: 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e  *   * The page-n
ad60: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
ad70: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50  an or equal to P
ad80: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f  agerSavepoint.nO
ad90: 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  rig, and.**   * 
ada0: 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  The bit correspo
adb0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  nding to the pag
adc0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  e-number is not 
add0: 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61  set in.**     Pa
ade0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
adf0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  Savepoint..*/.st
ae00: 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71  atic int subjReq
ae10: 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20  uiresPage(PgHdr 
ae20: 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67  *pPg){.  Pgno pg
ae30: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
ae40: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
ae50: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
ae60: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
ae70: 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  0; i<pPager->nSa
ae80: 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  vepoint; i++){. 
ae90: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
aea0: 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
aeb0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20  aSavepoint[i];. 
aec0: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e     if( p->nOrig>
aed0: 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69  =pgno && 0==sqli
aee0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d  te3BitvecTest(p-
aef0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
af00: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  gno) ){.      re
af10: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
af20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
af30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
af40: 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
af50: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
af60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
af70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
af80: 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72  eInJournal(PgHdr
af90: 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
afa0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
afb0: 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  st(pPg->pPager->
afc0: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
afd0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
afe0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
aff0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b000: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b010: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b020: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b030: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b040: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b050: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b060: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b070: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b080: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b090: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b0a0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b0b0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b0c0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b0d0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b0e0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b0f0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b100: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b110: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b120: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b130: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b140: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b150: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b160: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b170: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b180: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b190: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b1a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b1b0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b1c0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b1d0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b1e0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b1f0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b200: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b210: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b220: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b230: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b240: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b250: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b260: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b270: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b280: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b290: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b2a0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b2c0: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b2d0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b2e0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b2f0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b300: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
b310: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
b320: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
b330: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
b340: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
b350: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b360: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b370: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b380: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
b390: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
b3a0: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
b3b0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
b3c0: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
b3d0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
b3e0: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
b3f0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
b400: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
b410: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
b420: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
b430: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b440: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b450: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b460: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
b470: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
b480: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
b490: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
b4a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
b4b0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
b4c0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b4d0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
b4e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b4f0: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
b500: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b510: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b520: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b530: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
b540: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
b550: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
b560: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
b570: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
b580: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
b590: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
b5a0: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
b5b0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
b5c0: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
b5d0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
b5e0: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
b5f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
b600: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
b610: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b620: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
b630: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
b640: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b650: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
b660: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
b670: 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65  r->eLock = (u8)e
b680: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Lock;.    }.    
b690: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
b6a0: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
b6b0: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20  r, eLock)).  }. 
b6c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6d0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61  *.** Lock the da
b6e0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b6f0: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b700: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b710: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a   SHARED_LOCK,.**
b720: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
b730: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
b740: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
b750: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  is successful, s
b760: 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  et the.** Pager.
b770: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b780: 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  o the new lockin
b790: 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  g state. .**.** 
b7a0: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b7b0: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b7c0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b7d0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b7e0: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20   is .** called, 
b7f0: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b800: 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20   unless the new 
b810: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73  locking state is
b820: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
b830: 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d   .** See the com
b840: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b850: 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57  define of UNKNOW
b860: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b870: 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66  planation .** of
b880: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b890: 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62   int pagerLockDb
b8a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b8b0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b8c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b8d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  ;..  assert( eLo
b8e0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b8f0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  || eLock==RESERV
b900: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
b910: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b920: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
b930: 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c  ->eLock<eLock ||
b940: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
b950: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
b960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b970: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
b980: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
b990: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b9a0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
b9b0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
b9c0: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
b9d0: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
b9e0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
b9f0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
ba00: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
ba10: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
ba20: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
ba30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
ba40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
ba50: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
ba60: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
ba70: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
ba80: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
ba90: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
baa0: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
bab0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
bac0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
bad0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
bae0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
baf0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
bb00: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
bb10: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
bb20: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
bb30: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
bb40: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
bb50: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
bb60: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
bb70: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
bb80: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
bb90: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
bba0: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
bbb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
bbc0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
bbd0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
bbe0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
bbf0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
bc00: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
bc10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
bc20: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
bc30: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
bc40: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
bc50: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
bc60: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
bc70: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
bc80: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
bc90: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
bca0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bcb0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
bcc0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
bcd0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
bce0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
bcf0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
bd00: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
bd10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bd20: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
bd30: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
bd40: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
bd50: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
bd60: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
bd70: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
bd80: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
bd90: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
bdc0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
bdd0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
be00: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
be10: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
be20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
be30: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
be40: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
be50: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
be60: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
be70: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
be80: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
be90: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
bea0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
beb0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
bec0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
bed0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
bee0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
bef0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
bf00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
bf10: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
bf20: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
bf30: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
bf40: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
bf50: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
bf60: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
bf70: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
bf80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bf90: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
bfa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bfb0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
bfc0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
bfd0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
bfe0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
bff0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
c000: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
c010: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
c020: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
c030: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
c040: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
c050: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
c060: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
c070: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
c080: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c090: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
c0a0: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
c0b0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
c0c0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
c0d0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
c0e0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
c0f0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
c100: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
c110: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
c120: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c130: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
c140: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
c150: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
c160: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
c170: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
c180: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
c190: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
c1a0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
c1b0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
c1c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
c1d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
c1e0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
c1f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c200: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
c210: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
c220: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
c230: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
c240: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
c250: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
c260: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
c270: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
c280: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
c290: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
c2a0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
c2b0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
c2c0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
c2d0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
c2e0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
c2f0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
c300: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
c310: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
c320: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
c330: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
c340: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
c350: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
c360: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
c370: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
c380: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
c390: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
c3a0: 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
c3b0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
c3c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d  .  assert( (pPg-
c3d0: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
c3e0: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
c3f0: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
c400: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
c410: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
c420: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
c430: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
c440: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
c450: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c460: 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a  set_pagehash(X).
c470: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c480: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
c490: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c4a0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
c4b0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
c4c0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
c4d0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
c4e0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
c4f0: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
c500: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
c510: 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ead a master jou
c520: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66  rnal file name f
c530: 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20  rom the .** end 
c540: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c  of the file and,
c550: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
c560: 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d  copies it into m
c570: 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a  emory supplied .
c580: 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
c590: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
c5a0: 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72  bove writeMaster
c5b0: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68  Journal() for th
c5c0: 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64  e format.** used
c5d0: 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74   to store a mast
c5e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c5f0: 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20  name at the end 
c600: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  of a journal fil
c610: 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72  e..**.** zMaster
c620: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
c630: 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
c640: 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65  ast nMaster byte
c650: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
c660: 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  * the caller. Th
c670: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c  is should be sql
c680: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
c690: 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65  ame+1 (to ensure
c6a0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f   there is.** eno
c6b0: 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69  ugh space to wri
c6c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c6d0: 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20  urnal name). If 
c6e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c6f0: 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  al.** name in th
c700: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e  e journal is lon
c710: 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72  ger than nMaster
c720: 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e   bytes (includin
c730: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
c740: 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69  nator), then thi
c750: 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  s is handled as 
c760: 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  if no master jou
c770: 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72  rnal name.** wer
c780: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
c790: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c7a0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
c7b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c7c0: 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20   present at the 
c7d0: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
c7e0: 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  al.** file, then
c7f0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
c800: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
c810: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
c820: 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65  ter. A.** nul-te
c830: 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
c840: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
c850: 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e   buffer followin
c860: 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  g the master.** 
c870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c880: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  e..**.** If it i
c890: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  s determined tha
c8a0: 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  t no master jour
c8b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c8c0: 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61   present .** zMa
c8d0: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
c8e0: 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
c8f0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
c900: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
c910: 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69  curs while readi
c920: 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
c930: 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c  nal file, an SQL
c940: 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  ite.** error cod
c950: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
c960: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
c970: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
c980: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
c990: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
c9a0: 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b  r, u32 nMaster){
c9b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c9d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
c9e0: 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20    u32 len;      
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ca00: 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  Length in bytes 
ca10: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
ca20: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20  l name */.  i64 
ca30: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
ca40: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
ca50: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
ca60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a   journal file pJ
ca70: 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  rnl */.  u32 cks
ca80: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
ca90: 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73      /* MJ checks
caa0: 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  um value read fr
cab0: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  om journal */.  
cac0: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
cad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
cae0: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
caf0: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
cb00: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
cb10: 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20  ;   /* A buffer 
cb20: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
cb30: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d  c header */.  zM
cb40: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
cb50: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
cb60: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cb70: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
cb80: 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73  , &szJ)).   || s
cb90: 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49  zJ<16.   || SQLI
cba0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
cbb0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cbc0: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20  zJ-16, &len)).  
cbd0: 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72   || len>=nMaster
cbe0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cbf0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cc00: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cc10: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
cc20: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cc30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cc40: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
cc50: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
cc60: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
cc70: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
cc80: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
cc90: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cca0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
ccb0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
ccc0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
ccd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
cce0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
ccf0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
cd00: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
cd10: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
cd20: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
cd30: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
cd40: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
cd50: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
cd60: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
cd70: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
cd80: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
cd90: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
cda0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
cdb0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
cdc0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cdd0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
cde0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
cdf0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
ce00: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
ce10: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
ce20: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
ce30: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
ce40: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
ce50: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
ce60: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
ce70: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
ce80: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
ce90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cea0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ceb0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
cec0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
ced0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
cee0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
cef0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
cf00: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
cf10: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
cf20: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
cf30: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
cf40: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
cf50: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
cf60: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
cf70: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
cf80: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
cf90: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
cfa0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
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 2d 2d 2d 2d 0a  ---------------.
cfd0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
cff0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d060: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d070: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d080: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d090: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d0a0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d0b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d0c0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d0d0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d0e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d0f0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d100: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d110: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d120: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d130: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d140: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d150: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d160: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d170: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d180: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d190: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d1a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d1b0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d1c0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d1d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d1e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d1f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d200: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d210: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d220: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d230: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d240: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d250: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d260: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d270: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d280: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d290: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d2a0: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d2b0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d2c0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d2d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d2e0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d2f0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d300: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d310: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d320: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d340: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d350: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d360: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d370: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d380: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d390: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d3a0: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d3b0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d3c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d3d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d3e0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d3f0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d400: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d410: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d420: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d430: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d440: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d450: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d460: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d470: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d480: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d490: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d4a0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d4b0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d4c0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d4d0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d4e0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d4f0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d500: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d510: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d520: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d530: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d540: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d550: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d560: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d570: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d580: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d590: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d5a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d5b0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d5c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d5d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
d600: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
d610: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
d620: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
d630: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
d640: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
d650: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
d660: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d670: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
d680: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
d690: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
d6a0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
d6b0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
d6c0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
d6d0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
d6e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
d6f0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
d700: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
d710: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
d720: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
d730: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
d740: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d750: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
d760: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
d770: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
d780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d790: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d7a0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
d7b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d7c0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
d7d0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
d7e0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
d7f0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
d800: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d810: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d820: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
d830: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
d840: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
d850: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
d860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
d870: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
d880: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
d890: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
d8a0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
d8b0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
d8c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
d8d0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
d8e0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
d8f0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
d900: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
d910: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
d920: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
d930: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
d940: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
d950: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d960: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
d970: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d980: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
d990: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
d9a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d9b0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
d9c0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
d9d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d9e0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
d9f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
da00: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
da10: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
da20: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
da30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
da40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
da50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
da60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
da70: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
da80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
da90: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
daa0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
dab0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
dac0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
dad0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
dae0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
daf0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
db00: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
db10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
db20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
db30: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
db40: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
db50: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
db60: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
db70: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
db80: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
db90: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
dba0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dbb0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
dbc0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
dbd0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dbe0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
dbf0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
dc00: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
dc10: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
dc20: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
dc30: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
dc40: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
dc50: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
dc60: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
dc70: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
dc80: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
dc90: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
dca0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
dcb0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
dcc0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
dcd0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
dce0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
dcf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dd00: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
dd10: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
dd20: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
dd30: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
dd40: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
dd50: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
dd60: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
dd70: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
dd80: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
dd90: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
dda0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
ddb0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
dde0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
ddf0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
de00: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de20: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
de30: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
de40: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
de50: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
de60: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
de70: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
de80: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
de90: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
dea0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
deb0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
dec0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
ded0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
dee0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
def0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
df00: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
df10: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
df20: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
df30: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
df40: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
df50: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
df60: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
df70: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
df80: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
df90: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
dfa0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
dfb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
dfc0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
dfd0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
dfe0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
dff0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e000: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e010: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e020: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e030: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e040: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e050: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e060: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e070: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e080: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e090: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e0a0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e0b0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e0c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e0d0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e0e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e0f0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e100: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e110: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e120: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e130: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e140: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e150: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e160: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e170: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e180: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e190: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e1a0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e1b0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e1c0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e1d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e1e0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e1f0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e200: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e210: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e220: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e230: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e240: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e250: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e270: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e280: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e290: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e2a0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e2b0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e2c0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e2d0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e2e0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e2f0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e300: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e310: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e320: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e330: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e340: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e350: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e360: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e370: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e380: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e390: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e3a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e3b0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e3c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e3d0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e3e0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e3f0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e400: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e410: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e420: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e430: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e440: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e450: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e460: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e470: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e480: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e490: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e4a0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e4b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e4c0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e4d0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e4e0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e4f0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e500: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e510: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e520: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e530: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e540: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e550: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e560: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e570: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e580: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e590: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e5a0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e5b0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e5c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e5d0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e5e0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e5f0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
e600: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
e610: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
e620: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e630: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
e640: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
e650: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e660: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e670: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
e680: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
e690: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
e6a0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
e6b0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e6c0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e6d0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
e6e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
e6f0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
e700: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
e710: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
e720: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e730: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
e750: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
e760: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
e770: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
e780: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e790: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e7a0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
e7b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
e7c0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
e7d0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
e7e0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
e7f0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
e800: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
e810: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
e820: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
e830: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
e840: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
e850: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
e860: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
e870: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
e880: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
e890: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
e8a0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
e8b0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
e8c0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
e8d0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e8e0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
e8f0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
e900: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
e910: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
e920: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
e930: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
e940: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
e950: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
e960: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
e970: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
e980: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e990: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
e9a0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
e9b0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
e9c0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
e9d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
e9e0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
e9f0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
ea00: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
ea10: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
ea20: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
ea30: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ea40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
ea50: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ea60: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ea70: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ea80: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ea90: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
eaa0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
eab0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
eac0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
ead0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
eae0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
eaf0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
eb00: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
eb10: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
eb20: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
eb30: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
eb40: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
eb50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
eb60: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
eb70: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
eb80: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
eb90: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
eba0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
ebb0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
ebc0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
ebd0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
ebe0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
ebf0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
ec00: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
ec10: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
ec20: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
ec30: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
ec40: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
ec50: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
ec60: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
ec70: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
ec80: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
ec90: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
eca0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
ecb0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
ecc0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
ecd0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
ece0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
ecf0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
ed00: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
ed10: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
ed20: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
ed30: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
ed40: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
ed50: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
ed60: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ed70: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
ed80: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
ed90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
eda0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
edb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
edc0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
edd0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
ede0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
edf0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
ee00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ee10: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
ee20: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
ee30: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
ee40: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
ee50: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
ee60: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ee70: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
ee80: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
ee90: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
eea0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
eeb0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
eec0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
eed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
eee0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
eef0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
ef00: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
ef10: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
ef20: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
ef30: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
ef40: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
ef50: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
ef60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
ef70: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
ef80: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
ef90: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
efa0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
efb0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
efc0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
efd0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
efe0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
eff0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f000: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f010: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f020: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f030: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f040: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f050: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f060: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f070: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f080: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f090: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f0a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f0b0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f0c0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f0d0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f0e0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f0f0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f100: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f110: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f120: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f130: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f140: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f150: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f160: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f170: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f180: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f190: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f1a0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f1b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f1c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f1d0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f1e0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f1f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f200: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f210: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f220: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f240: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f250: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f260: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f270: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f280: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f290: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f2a0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f2b0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f2c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f2e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f2f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f300: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f310: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f320: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f330: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f350: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f360: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f370: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f380: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f390: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f3a0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f3b0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f3c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f3d0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f3e0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f3f0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f400: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f410: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f420: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f430: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f440: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f450: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f470: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f480: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f490: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f4a0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f4b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f4c0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f4d0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f4e0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f500: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f510: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f520: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f530: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f540: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f550: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f560: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f570: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f580: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f590: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f5a0: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f5b0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f5c0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f5d0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f5e0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f5f0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
f600: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
f610: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
f620: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
f630: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f640: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
f650: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
f660: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
f670: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
f680: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
f690: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
f6a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f6b0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
f6c0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
f6d0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f6e0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
f6f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f700: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
f710: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
f720: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
f730: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
f740: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
f750: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
f760: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
f770: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
f780: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
f790: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
f7a0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
f7b0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
f7c0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f7d0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
f7e0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
f7f0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
f800: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f810: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f820: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
f830: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f840: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f850: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f860: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
f870: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
f880: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f890: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f8a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f8b0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
f8c0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
f8d0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
f8e0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f8f0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
f900: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
f910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f920: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f930: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f940: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
f950: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
f960: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
f970: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
f980: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
f990: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
f9a0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
f9b0: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
f9c0: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
f9d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
f9e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f9f0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fa00: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fa10: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fa20: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
fa30: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fa40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa50: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
fa60: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
fa70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fa80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fa90: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
faa0: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
fab0: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fac0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fad0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fae0: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
faf0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
fb00: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
fb10: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
fb20: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
fb30: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
fb40: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
fb50: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
fb60: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
fb70: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
fb80: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
fb90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
fba0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
fbb0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
fbc0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
fbd0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
fbe0: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
fbf0: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
fc00: 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
fc10: 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
fc20: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
fc30: 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
fc40: 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
fc50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
fc60: 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
fc70: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
fc80: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
fc90: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
fca0: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
fcb0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
fcc0: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
fcf0: 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
fd00: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
fd10: 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
fd20: 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
fd30: 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
fd40: 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
fd50: 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
fd60: 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
fd70: 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
fd80: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
fd90: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
fda0: 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
fdb0: 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
fdc0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
fdd0: 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
fde0: 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
fdf0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
fe00: 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
fe10: 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
fe20: 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
fe30: 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
fe40: 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
fe50: 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
fe60: 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
fe70: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
fe80: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
fe90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
fea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
feb0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
fec0: 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
fed0: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
fee0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
fef0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
ff00: 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
ff10: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
ff20: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
ff30: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
ff40: 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
ff50: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
ff60: 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
ff70: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
ff80: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
ff90: 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
ffa0: 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
ffb0: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
ffc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
ffd0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
ffe0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
fff0: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10000 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10010 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10020 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10030 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10040 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10050 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10060 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10070 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10080 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10090 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
100a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
100b0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
100c0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
100d0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
100e0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
100f0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10100 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10110 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10120 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10130 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10140 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10150 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10160 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10170 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10180 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10190 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
101a0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
101b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
101c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
101d0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
101e0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
101f0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10200 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10210 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10220 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10230 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10240 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10250 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10260 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10270 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10280 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10290 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
102a0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
102b0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
102c0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
102d0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
102e0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
102f0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10300 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10310 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10320 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10330 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10340 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10350 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10360 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10370 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10380 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10390 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
103a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
103b0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
103c0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
103d0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
103e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103f0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10400 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10410 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10420 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10430 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10440 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10450 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10460 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10470 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10480 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10490 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
104a0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
104b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
104c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
104d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
104e0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
104f0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10500 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10510 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10520 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10550 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10570 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10580 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10590 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
105a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
105b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
105c0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
105d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
105e0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10610 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10620 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10630 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10640 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10650 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10660 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10670 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10680 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10690 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
106a0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
106b0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
106c0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
106d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
106e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
106f0 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  RY .   || pPager
10700 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10710 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10720 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72  _OFF .  ){.    r
10730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10740 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
10750 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20  etMaster = 1;.  
10760 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
10770 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
10780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10790 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
107a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
107b0 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
107c0 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
107d0 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
107e0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
107f0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10800 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10810 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10820 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10830 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10840 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10850 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10860 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10870 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10880 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10890 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
108a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108b0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
108c0 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
108d0 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
108e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
108f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10900 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10910 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10920 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10930 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10940 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10950 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10960 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10970 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10980 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10990 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
109a0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
109b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
109c0 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
109d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
109e0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
109f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10a00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10a10 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10a20 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10a30 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10a40 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10a50 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10a60 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
10a70 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
10a80 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
10a90 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
10aa0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10ab0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10ac0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10ad0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
10ae0 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
10af0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10b00 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10b10 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
10b20 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
10b30 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10b40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10b50 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
10b60 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
10b70 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
10b80 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
10b90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10ba0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
10bb0 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
10bc0 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  er+20);..  /* If
10bd0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10be0 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
10bf0 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
10c00 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
10c10 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
10c20 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
10c30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
10c40 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
10c50 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
10c60 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
10c70 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
10c80 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
10c90 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
10ca0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
10cb0 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
10cc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
10cd0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
10ce0 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
10cf0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10d00 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
10d10 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
10d20 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
10d30 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
10d40 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
10d50 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
10d60 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
10d70 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
10d80 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
10d90 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
10da0 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
10db0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
10dc0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
10dd0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10de0 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
10df0 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  ).   && jrnlSize
10e00 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  >pPager->journal
10e10 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
10e20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
10e30 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
10e40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e50 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
10e60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10e70 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
10e80 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
10e90 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
10ea0 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  ber. Return.** a
10eb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10ec0 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
10ed0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
10ee0 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c  ge is not .** al
10ef0 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e  ready in memory.
10f00 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
10f10 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
10f20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
10f30 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
10f40 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f60 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
10f70 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
10f80 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
10f90 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65  call to PcacheFe
10fa0 74 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74  tch() with creat
10fb0 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a  eFlag==0 to.  **
10fc0 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20   fail, since no 
10fd0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
10fe0 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  ate dynamic memo
10ff0 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e  ry will be made.
11000 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
11010 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
11020 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11030 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a  , pgno, 0, &p);.
11040 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
11050 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
11060 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11070 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
11080 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
110a0 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
110b0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
110c0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
110d0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
110e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
110f0 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
11100 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
11110 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
11120 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
11130 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
11140 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
11150 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
11160 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
11170 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
11180 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
11190 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
111a0 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
111b0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
111c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
111d0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
111e0 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
111f0 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
11200 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
11210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11220 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
11230 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
11240 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11250 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
11260 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
11270 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
11280 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11290 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
112a0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
112b0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
112c0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
112d0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
112e0 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
112f0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
11300 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
11310 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
11320 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
11330 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
11340 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
11350 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
11360 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
11370 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
11380 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11390 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ubRec = 0;.}../*
113a0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
113b0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
113c0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
113d0 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a  t.pInSavepoint .
113e0 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c  ** bitvecs of al
113f0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
11400 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  s. Return SQLITE
11410 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
11420 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  l.** or SQLITE_N
11430 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
11440 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
11450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
11460 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
11470 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
11480 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
11490 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
114a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
114b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
114c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
114d0 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
114e0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  sult code */..  
114f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11500 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11510 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65   ii++){.    Page
11520 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
11530 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
11540 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  int[ii];.    if(
11550 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20   pgno<=p->nOrig 
11560 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73  ){.      rc |= s
11570 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
11580 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
11590 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65   pgno);.      te
115a0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
115b0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
115c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
115d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
115e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
115f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11610 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11620 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
11630 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11640 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f  sive mode and no
11650 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f  t.** in the ERRO
11660 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
11670 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20  se, it switches 
11680 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47  the pager to PAG
11690 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65  ER_OPEN.** state
116a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
116b0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
116c0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
116d0 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61  mode, the databa
116e0 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f  se file is.** co
116f0 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65  mpletely unlocke
11700 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  d. If the file i
11710 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74  s unlocked and t
11720 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  he file-system d
11730 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62  oes.** not exhib
11740 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42  it the UNDELETAB
11750 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f  LE_WHEN_OPEN pro
11760 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e  perty, the journ
11770 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c  al file is.** cl
11780 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f  osed (if it is o
11790 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pen)..**.** If t
117a0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45  he pager is in E
117b0 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
117c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
117d0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a   called, the .**
117e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
117f0 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65   pager cache are
11800 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72   discarded befor
11810 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b  e switching back
11820 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e   to .** the OPEN
11830 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65   state. Regardle
11840 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
11850 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11860 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20  clusive-mode.** 
11870 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72  or not, any jour
11880 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e  nal file left in
11890 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
118a0 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
118b0 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  .** as a hot-jou
118c0 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
118d0 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69  back the next ti
118e0 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  me a read-transa
118f0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e  ction.** is open
11900 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62  ed (by this or b
11910 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e  y any other conn
11920 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74  ection)..*/.stat
11930 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
11940 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
11950 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  er){..  assert( 
11960 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11970 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
11980 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
11990 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
119a0 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  EN .       || pP
119b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
119c0 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a  GER_ERROR .  );.
119d0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
119e0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
119f0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
11a00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
11a10 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  l = 0;.  release
11a20 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
11a30 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61  ager);..  if( pa
11a40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
11a50 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
11a60 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
11a70 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c  >jfd) );.    sql
11a80 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
11a90 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
11aa0 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61  ->pWal);.    pPa
11ab0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
11ac0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GER_OPEN;.  }els
11ad0 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
11ae0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
11af0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
11b20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65  returned by page
11b30 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20  rUnlockDb() */. 
11b40 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f     int iDc = isO
11b50 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f  pen(pPager->fd)?
11b60 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11b70 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
11b80 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20  Pager->fd):0;.. 
11b90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65     /* If the ope
11ba0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75  rating system su
11bb0 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f  pport deletion o
11bc0 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68  f open files, th
11bd0 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20  en.    ** close 
11be0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11bf0 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
11c00 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
11c10 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
11c20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   ** another conn
11c30 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
11c40 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
11c50 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65  might delete the
11c60 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74   file.    ** out
11c70 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
11c80 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11c90 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11ca0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26  LMODE_MEMORY   &
11cb0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11cc0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11cd0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
11ce0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11cf0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11d00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
11d10 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
11d20 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11d30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
11d40 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20  ELETE   & 5)!=1 
11d50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11d60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11d70 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
11d80 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11d90 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11da0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20  MODE_PERSIST  & 
11db0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  5)==1 );.    if(
11dc0 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54   0==(iDc & SQLIT
11dd0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
11de0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20  BLE_WHEN_OPEN). 
11df0 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65      || 1!=(pPage
11e00 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26  r->journalMode &
11e10 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   5).    ){.     
11e20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11e30 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
11e40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
11e50 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
11e60 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
11e70 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  nd the call to u
11e80 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
11e90 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66  se.    ** file f
11ea0 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75  ails, set the cu
11eb0 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e  rrent lock to UN
11ec0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
11ed0 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20  the comment.    
11ee0 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  ** above the #de
11ef0 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e  fine for UNKNOWN
11f00 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
11f10 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20  lanation of why 
11f20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e  this.    ** is n
11f30 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
11f40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
11f50 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
11f60 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  NO_LOCK);.    if
11f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11f80 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
11f90 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e==PAGER_ERROR )
11fa0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
11fb0 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f  eLock = UNKNOWN_
11fc0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LOCK;.    }..   
11fd0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74   /* The pager st
11fe0 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67  ate may be chang
11ff0 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52  ed from PAGER_ER
12000 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ROR to PAGER_OPE
12010 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69  N here.    ** wi
12020 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74  thout clearing t
12030 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  he error code. T
12040 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e  his is intention
12050 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20  al - the error. 
12060 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c     ** code is cl
12070 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61  eared and the ca
12080 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65  che reset in the
12090 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20   block below..  
120a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
120b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
120c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
120d0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
120e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
120f0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12100 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
12110 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
12120 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PEN;.  }..  /* I
12130 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
12140 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
12150 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12160 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
12170 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20  e.  ** trusted. 
12180 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61  Now that there a
12190 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
121a0 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
121b0 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20  the pager,.  ** 
121c0 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f  it can safely mo
121d0 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ve back to PAGER
121e0 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69  _OPEN state. Thi
121f0 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74  s happens in bot
12200 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e  h.  ** normal an
12210 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  d exclusive-lock
12220 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing mode..  */. 
12230 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
12240 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Code ){.    asse
12250 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
12260 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
12270 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
12280 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12290 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
122a0 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65  pFile;.    pPage
122b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
122c0 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67  R_OPEN;.    pPag
122d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
122e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
122f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12300 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
12310 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
12320 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
12330 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aster = 0;.}../*
12340 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12350 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
12360 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72  ever an IOERR or
12370 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74   FULL error that
12380 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65   requires.** the
12390 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69   pager to transi
123a0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52  tion into the ER
123b0 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68  ROR state may ah
123c0 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  ve occurred..** 
123d0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
123e0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
123f0 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
12400 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
12410 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  nd .** the error
12420 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
12430 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
12440 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
12450 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75  on. The .** valu
12460 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
12470 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
12480 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
12490 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
124a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
124b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
124c0 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
124d0 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
124e0 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20  of the.** IOERR 
124f0 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70  sub-codes, the p
12500 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20  ager enters the 
12510 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
12520 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
12530 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50  * is stored in P
12540 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68  ager.errCode. Wh
12550 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65  ile the pager re
12560 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52  mains in the ERR
12570 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c  OR state,.** all
12580 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73   major API calls
12590 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69   on the Pager wi
125a0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
125b0 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43  eturn Pager.errC
125c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ode..**.** The E
125d0 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63  RROR state indic
125e0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
125f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12600 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
12610 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
12620 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
12630 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
12640 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
12650 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
12660 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12670 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
12680 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
12690 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
126a0 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
126b0 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  r occurred, then
126c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
126d0 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
126e0 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
126f0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
12700 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
12720 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20  s if.** it were 
12730 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
12740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
12750 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
12760 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
12770 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
12780 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
12790 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
127a0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
127b0 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
127c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
127d0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
127e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
127f0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
12800 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
12810 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
12820 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
12830 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32  R.  );.  if( rc2
12840 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12850 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
12860 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  RR ){.    pPager
12870 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
12880 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12890 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52  te = PAGER_ERROR
128a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
128b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
128c0 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
128d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
128e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
128f0 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12900 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12910 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12920 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12930 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12940 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12950 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
12960 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
12970 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12980 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
12990 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
129a0 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
129b0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
129c0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
129d0 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
129e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
129f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12a00 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
12a10 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
12a20 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
12a30 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
12a40 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
12a50 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
12a60 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
12a70 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
12a80 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
12a90 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
12aa0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
12ab0 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
12ac0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
12ad0 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
12ae0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
12af0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
12b00 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
12b10 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
12b20 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
12b30 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
12b40 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
12b50 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
12b60 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
12b70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
12b80 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
12b90 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
12ba0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
12bb0 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
12bc0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
12bd0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
12be0 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
12bf0 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
12c00 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
12c10 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
12c20 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12c30 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12c40 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
12c50 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
12c60 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
12c70 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
12c80 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
12c90 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
12ca0 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
12cb0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
12cc0 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
12cd0 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
12ce0 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
12cf0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
12d00 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12d10 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
12d20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
12d30 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
12d40 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
12d50 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
12d60 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
12d70 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
12d80 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
12d90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12da0 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
12db0 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
12dc0 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
12dd0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12de0 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
12df0 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
12e00 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
12e10 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
12e20 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
12e30 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
12e40 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
12e50 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
12e60 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
12e70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
12e80 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
12e90 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
12ea0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
12eb0 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
12ec0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
12ed0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
12ee0 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
12ef0 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
12f00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12f10 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
12f20 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
12f30 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
12f40 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
12f50 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12f60 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
12f70 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
12f80 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
12f90 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
12fa0 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
12fb0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
12fc0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
12fd0 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
12fe0 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
12ff0 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13000 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13010 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13020 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
13030 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
13040 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
13050 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
13060 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
13070 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
13080 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
13090 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
130a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
130b0 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
130c0 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
130d0 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
130e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
130f0 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
13100 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
13110 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13120 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
13130 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
13140 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
13150 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
13160 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
13170 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
13180 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
13190 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
131a0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
131b0 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
131c0 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
131d0 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
131e0 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
131f0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
13200 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
13210 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13220 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
13230 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
13240 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
13250 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
13260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13270 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
13280 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
13290 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
132a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
132b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
132c0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
132d0 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
132e0 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
132f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
13300 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13310 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13320 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
13330 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
13340 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13350 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
13360 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
13370 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
13380 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
13390 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
133a0 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
133b0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
133c0 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
133d0 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
133e0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
133f0 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
13400 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13410 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
13420 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
13430 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
13440 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13450 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
13460 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
13470 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
13480 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
13490 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
134a0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
134b0 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
134c0 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
134d0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
134e0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
134f0 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
13500 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
13510 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
13520 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
13530 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
13540 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13550 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
13560 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
13570 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13580 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
13590 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
135a0 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
135b0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
135c0 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
135d0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
135e0 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
135f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13600 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13610 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13620 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13630 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13640 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13650 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
13660 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
13670 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
13680 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
136a0 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
136b0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
136c0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
136d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
136e0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
136f0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13700 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13710 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13720 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13730 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13740 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13760 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
13770 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
13780 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
13790 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
137a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137b0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
137c0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
137d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
137e0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
137f0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
13800 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13810 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13820 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13830 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
13840 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13850 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
13860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13890 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
138a0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
138b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
138c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
138d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
138e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
138f0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13900 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13910 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13920 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13930 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13940 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13950 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
13960 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
13970 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
13980 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
13990 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
139a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
139b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
139c0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
139d0 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
139e0 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
139f0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13a00 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13a10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13a20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13a30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13a40 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13a50 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
13a60 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
13a70 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
13a80 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
13a90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
13aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13ab0 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13ac0 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13ad0 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13ae0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13af0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13b00 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13b10 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
13b20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13b30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13b40 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13b50 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
13b60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
13b70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13b80 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13b90 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
13ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13bb0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13bc0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
13bd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
13be0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13bf0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13c00 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13c10 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13c20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13c30 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13c40 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13c50 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13c60 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13c70 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13c80 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13c90 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13ca0 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13cb0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13cc0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13cd0 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13ce0 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13cf0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13d00 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13d10 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13d20 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13d30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13d50 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13d60 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
13d70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
13d80 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
13d90 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
13da0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
13db0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
13dc0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
13dd0 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
13de0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
13df0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
13e00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
13e10 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
13e20 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
13e30 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
13e40 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
13e50 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
13e60 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13e70 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
13e80 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
13e90 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
13ea0 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
13eb0 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
13ec0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
13ed0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
13ee0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
13ef0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13f00 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
13f10 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
13f20 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
13f30 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
13f40 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   );.  }.  if( !p
13f50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13f60 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
13f70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13f80 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
13f90 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
13fa0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
13fb0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
13fc0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
13fd0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
13fe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
13ff0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14000 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14010 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14020 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14030 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14040 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14050 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14070 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14080 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14090 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
140a0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
140b0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
140c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
140d0 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
140e0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
140f0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14100 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14110 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14120 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14130 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14140 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14150 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14160 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14170 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14180 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
141a0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
141b0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
141c0 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
141d0 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
141e0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
141f0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14200 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14210 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14220 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14230 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14240 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14250 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14260 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
14270 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
14280 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14290 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
142a0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
142b0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
142c0 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
142d0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
142e0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
142f0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14300 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14310 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14320 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14330 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14340 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14350 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14360 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14370 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14380 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14390 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
143a0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
143b0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
143c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
143d0 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
143e0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
143f0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14400 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14410 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14420 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14430 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14440 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14460 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14480 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14490 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
144a0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
144b0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
144c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
144d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
144e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
144f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14500 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14510 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14520 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14530 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
14540 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
14550 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
14560 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
14570 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
14580 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
14590 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
145a0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
145b0 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
145c0 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
145d0 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
145e0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
145f0 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
14600 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
14610 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
14620 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
14630 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
14640 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
14650 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
14660 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
14670 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
14680 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
14690 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
146a0 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
146b0 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
146c0 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
146d0 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
146e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
146f0 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
14700 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
14710 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
14720 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
14730 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
14740 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
14750 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
14760 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
14770 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
14780 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
14790 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
147a0 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
147b0 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
147c0 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
147d0 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
147e0 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
147f0 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
14800 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
14810 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
14820 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
14830 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
14840 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
14850 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
14860 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
14870 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
14880 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
14890 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
148a0 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
148b0 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
148c0 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
148d0 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
148e0 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
148f0 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
14900 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
14910 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
14920 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
14930 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
14940 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
14950 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14960 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
14970 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
14980 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
14990 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
149a0 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
149b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
149c0 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
149d0 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
149e0 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
149f0 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
14a00 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
14a10 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
14a20 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
14a30 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
14a40 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
14a50 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
14a60 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
14a70 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
14a80 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
14a90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
14aa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14ab0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
14ac0 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
14ad0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
14ae0 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
14af0 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
14b00 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
14b30 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
14b40 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
14b50 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
14b60 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
14b70 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
14b80 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
14b90 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
14ba0 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
14bb0 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
14bc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14bd0 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
14be0 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
14bf0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
14c00 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
14c10 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
14c20 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
14c30 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
14c40 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
14c50 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
14c60 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
14c70 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
14c80 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
14c90 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
14ca0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
14cb0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
14cc0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
14cd0 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
14ce0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
14cf0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
14d00 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
14d10 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
14d20 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14d30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14d40 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14d50 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
14d60 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
14d70 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
14d80 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
14d90 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
14da0 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
14db0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
14dc0 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
14dd0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
14de0 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
14df0 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
14e00 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
14e10 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
14e20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
14e30 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
14e40 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
14e50 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
14e60 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
14e70 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
14e80 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
14e90 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
14ea0 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
14eb0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
14ec0 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
14ed0 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
14ee0 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
14ef0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
14f00 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
14f10 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
14f20 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
14f30 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
14f40 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
14f50 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
14f60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14f70 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
14f80 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
14f90 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
14fa0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14fb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
14fc0 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
14fd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14fe0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
14ff0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
15000 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
15010 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
15020 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
15030 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15040 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
15050 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
15060 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
15070 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
15080 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
15090 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
150a0 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
150b0 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
150c0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
150d0 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
150e0 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
150f0 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
15100 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
15110 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
15120 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
15130 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
15140 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
15150 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
15160 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
15170 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
15180 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
15190 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
151a0 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
151b0 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
151c0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
151d0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
151e0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
151f0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
15200 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
15210 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
15220 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
15230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
15240 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
15250 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
15260 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
15270 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
15280 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
15290 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
152a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
152b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
152c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
152d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
152e0 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
152f0 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
15300 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
15310 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
15320 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
15330 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
15340 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
15350 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
15360 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
15370 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15380 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
15390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
153a0 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
153b0 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
153c0 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
153d0 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
153e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
153f0 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
15400 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
15410 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
15420 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
15430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15440 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
15450 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
15460 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
15490 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
154a0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
154b0 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
154c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
154d0 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
154e0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
154f0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
15500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15510 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
15520 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
15530 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
15540 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
15550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
15560 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
15570 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
15580 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
15590 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
155a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
155b0 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
155c0 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
155d0 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
155e0 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
155f0 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
15600 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
15610 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
15620 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
15630 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
15640 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15650 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
15660 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
15670 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
15680 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
15690 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
156a0 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
156b0 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
156c0 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
156d0 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
156e0 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
156f0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
15700 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
15710 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
15720 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
15730 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
15740 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
15750 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
15760 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
15770 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
15780 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
15790 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65  ) );..  /* Eithe
157a0 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67  r the state is g
157b0 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45  reater than PAGE
157c0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
157d0 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  D (a transaction
157e0 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f   .  ** or savepo
157f0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e  int rollback don
15800 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74  e at the request
15810 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20   of the caller) 
15820 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20  or this is.  ** 
15830 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15840 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73  llback. If it is
15850 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
15860 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67  ollback, the pag
15870 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74  er.  ** is in st
15880 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c  ate OPEN and hol
15890 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ds an EXCLUSIVE 
158a0 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61  lock. Hot-journa
158b0 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  l rollback.  ** 
158c0 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20  only reads from 
158d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
158e0 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f  , not the sub-jo
158f0 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
15900 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15910 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15920 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
15930 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
15940 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
15950 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  N && pPager->eLo
15960 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15970 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  CK).  );.  asser
15980 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15990 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
159a0 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61  CACHEMOD || isMa
159b0 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20  inJrnl );..  /* 
159c0 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
159d0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
159e0 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
159f0 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
15a00 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
15a10 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
15a20 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
15a30 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
15a40 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
15a50 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
15a60 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
15a70 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
15a80 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
15a90 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
15aa0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
15ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15ac0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
15ad0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
15ae0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
15af0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
15b00 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
15b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15b30 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
15b40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
15b50 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
15b60 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
15b70 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
15b80 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
15b90 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
15ba0 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
15bb0 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
15bc0 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
15bd0 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
15be0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
15bf0 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
15c00 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
15c10 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
15c20 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
15c30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
15c40 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
15c50 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
15c60 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
15c70 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
15c80 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
15c90 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
15ca0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
15cb0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
15cc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15cd0 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
15ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15cf0 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
15d00 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
15d10 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
15d20 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
15d30 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
15d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15d50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
15d60 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
15d70 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
15d80 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
15d90 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
15da0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15db0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
15dc0 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
15dd0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
15de0 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75  u8*)aData)!=cksu
15df0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
15e00 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
15e10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15e20 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20  f this page has 
15e30 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
15e40 79 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75  yed by before du
15e50 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
15e60 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
15e70 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
15e80 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
15e90 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
15ea0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
15eb0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15ec0 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
15ed0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
15ee0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15ef0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
15f00 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
15f10 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
15f20 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
15f30 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
15f40 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
15f50 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
15f60 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
15f70 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15f80 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
15f90 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
15fa0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
15fb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15fc0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
15fd0 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
15fe0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
15ff0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
16000 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
16010 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
16020 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
16030 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
16040 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
16050 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16060 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
16070 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
16080 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
16090 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
160a0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
160b0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
160c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
160d0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
160e0 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
160f0 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
16100 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16110 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
16120 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
16130 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16140 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
16150 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
16160 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
16170 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
16180 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
16190 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
161a0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
161b0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
161c0 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
161d0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
161e0 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
161f0 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
16200 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
16210 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
16220 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
16230 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
16240 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
16250 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
16260 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
16270 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
16280 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
16290 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
162a0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
162b0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
162c0 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
162d0 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
162e0 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
162f0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
16300 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
16310 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
16320 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
16330 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
16340 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16350 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
16360 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
16370 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
16380 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
16390 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
163a0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
163b0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
163c0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
163d0 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
163e0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
163f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
16400 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
16410 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
16420 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
16430 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
16440 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
16450 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
16460 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
16470 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
16480 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
16490 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
164a0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
164b0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
164c0 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
164d0 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
164e0 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
164f0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
16500 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
16510 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
16520 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
16530 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
16540 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
16550 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
16560 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
16570 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
16580 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
16590 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
165a0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
165b0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
165c0 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
165d0 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
165e0 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
165f0 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
16600 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
16610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16620 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
16630 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
16640 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
16650 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
16660 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
16670 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
16680 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
16690 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
166a0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
166b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
166c0 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
166d0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
166e0 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
166f0 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
16700 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
16710 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
16720 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
16730 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
16740 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
16750 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
16760 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
16770 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
16780 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
16790 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
167a0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
167b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
167c0 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
167d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
167e0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
167f0 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
16800 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
16810 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
16820 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
16830 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
16840 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
16850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16860 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
16870 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
16880 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
16890 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
168a0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
168b0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
168c0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
168d0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
168e0 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
168f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
16900 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
16910 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
16920 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
16930 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
16940 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
16950 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
16960 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
16970 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
16980 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
16990 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
169a0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
169b0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
169c0 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
169d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
169e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
169f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
16a00 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
16a10 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16a20 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
16a30 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
16a40 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
16a50 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
16a60 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
16a70 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
16a80 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
16a90 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
16aa0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
16ab0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
16ac0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
16ad0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16ae0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
16af0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
16b00 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
16b10 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
16b20 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16b30 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
16b40 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
16b50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16b60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16b70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
16b80 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
16b90 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
16ba0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
16bb0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
16bc0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
16bd0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
16be0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
16bf0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
16c00 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
16c10 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
16c20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
16c30 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
16c40 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
16c50 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
16c60 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
16c70 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
16c80 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
16c90 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
16ca0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
16cb0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
16cc0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
16cd0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16ce0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
16cf0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
16d00 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
16d10 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
16d20 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
16d30 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
16d40 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
16d50 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
16d60 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
16d70 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16d80 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
16d90 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
16da0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
16db0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16dc0 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
16dd0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
16de0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
16df0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
16e00 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
16e10 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
16e20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
16e30 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
16e40 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
16e50 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
16e60 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
16e70 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16e80 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16e90 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
16ea0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
16eb0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
16ec0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
16ed0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
16ee0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
16ef0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
16f00 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
16f10 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
16f20 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
16f30 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
16f40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16f50 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
16f60 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
16f70 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
16f80 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
16f90 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
16fa0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
16fb0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
16fc0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
16fd0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
16fe0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
16ff0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
17000 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
17010 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
17020 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17030 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17040 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17050 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17060 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17070 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17080 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17090 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
170a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
170b0 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
170c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
170d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
170e0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
170f0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
17100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
17110 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
17120 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17130 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17140 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17150 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17160 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17170 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17180 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17190 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
171a0 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
171b0 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
171c0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
171d0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
171e0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
171f0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
17200 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
17210 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
17220 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17230 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17240 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17250 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17260 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17270 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17280 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17290 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
172a0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
172b0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
172c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
172d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
172e0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
172f0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
17300 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
17310 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
17320 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17330 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17340 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17350 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17360 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17370 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17380 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17390 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
173a0 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
173b0 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
173c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
173d0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
173e0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
173f0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
17400 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
17410 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
17420 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17430 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17440 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17450 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17460 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17470 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17480 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17490 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
174a0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
174b0 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
174c0 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
174d0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
174e0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
174f0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
17500 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
17510 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
17520 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17530 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17540 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17550 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17560 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17570 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17580 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17590 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
175a0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
175b0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
175c0 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
175d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
175e0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
175f0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17600 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17610 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17620 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17630 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17640 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17650 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17660 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17670 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17680 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17690 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
176a0 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
176b0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
176c0 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
176d0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
176e0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
176f0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17700 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17710 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17720 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17740 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17750 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17760 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17770 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17780 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17790 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
177a0 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
177b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
177c0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
177d0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
177e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
177f0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17800 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17810 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17820 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17830 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17840 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17850 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17860 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17870 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17880 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17890 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
178a0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
178b0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
178c0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
178d0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
178e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
178f0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17900 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17910 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17920 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17930 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17940 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17950 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
17960 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
17970 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
17980 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
17990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
179a0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
179b0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
179c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
179d0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
179e0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
179f0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17a00 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17a10 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17a20 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17a30 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17a40 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17a50 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17a60 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17a70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17a80 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17a90 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17aa0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17ab0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17ac0 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17ad0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17ae0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17af0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17b10 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17b20 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17b30 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
17b40 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
17b50 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
17b60 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
17b70 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
17b80 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
17b90 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
17ba0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
17bb0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
17bc0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
17bd0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
17be0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
17bf0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
17c00 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
17c10 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17c20 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
17c30 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
17c40 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
17c50 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
17c60 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
17c70 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
17c80 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
17c90 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
17ca0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
17cb0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
17cc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
17cd0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
17ce0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
17cf0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
17d00 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
17d10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
17d20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17d30 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
17d40 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
17d50 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
17d60 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
17d70 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
17d80 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
17d90 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
17da0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
17db0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
17dc0 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
17dd0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
17de0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
17df0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
17e00 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
17e10 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
17e20 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17e30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
17e40 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
17e50 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
17e60 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
17e70 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
17e80 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
17e90 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
17ea0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
17eb0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
17ec0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
17ed0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
17ee0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
17ef0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
17f00 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
17f10 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
17f20 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
17f30 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
17f40 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
17f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
17f60 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
17f70 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
17f80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
17f90 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
17fa0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
17fb0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
17fc0 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
17fd0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
17fe0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
17ff0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
18000 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
18010 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
18020 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18030 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18040 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18050 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18060 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18070 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18080 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18090 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
180a0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
180b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
180c0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
180d0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
180e0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
180f0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
18100 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
18110 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
18120 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18130 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18140 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18160 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18170 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18180 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18190 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
181a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
181b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
181c0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
181d0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
181e0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
181f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
18210 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
18220 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18230 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18240 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18250 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18260 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18270 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18280 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18290 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
182a0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
182b0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
182c0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
182d0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
182e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
182f0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
18300 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
18310 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18320 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18330 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18340 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18350 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18360 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18370 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18380 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18390 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
183a0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
183b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
183c0 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
183d0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
183e0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
183f0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
18400 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
18410 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
18420 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18430 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18440 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18450 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18460 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18470 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18480 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18490 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
184a0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
184b0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
184c0 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
184d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
184e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
184f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
18500 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18510 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18520 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18530 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18540 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18550 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18560 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18570 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18590 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
185a0 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
185b0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
185c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
185d0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
185e0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
185f0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18600 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18610 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18620 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18630 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18640 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18650 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18660 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18670 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18680 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18690 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
186a0 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
186b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
186c0 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
186d0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
186e0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
186f0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18700 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18710 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18720 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18730 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18740 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18750 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18760 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18770 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18780 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
18790 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
187a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
187b0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
187c0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
187d0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
187e0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
187f0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18800 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18810 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18820 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18830 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18850 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18860 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
18870 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18880 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
18890 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
188a0 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
188b0 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
188c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
188d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
188e0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
188f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18900 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18910 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18920 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18930 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18950 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
18960 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18970 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
18980 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
18990 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
189a0 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
189b0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
189c0 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
189d0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
189e0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
189f0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18a00 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18a10 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18a20 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18a30 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18a40 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18a50 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
18a60 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
18a70 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18a80 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18a90 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18aa0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18ab0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18ac0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18ad0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b00 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18b10 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18b20 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
18b30 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
18b40 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
18b50 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
18b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
18b70 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
18b80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18b90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18ba0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18bb0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18bc0 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
18bd0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
18be0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
18bf0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
18c00 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
18c10 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
18c20 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
18c30 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
18c40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18c50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
18c60 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18c80 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
18c90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18ca0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
18cb0 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
18cc0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
18cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
18ce0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
18cf0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
18d00 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
18d10 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
18d20 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
18d30 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
18d40 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18d50 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
18d60 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
18d70 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
18d80 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
18d90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18da0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
18db0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
18dc0 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
18dd0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
18de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
18df0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
18e00 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
18e10 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
18e20 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
18e30 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
18e40 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
18e50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
18e60 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
18e70 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
18e80 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
18e90 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
18ea0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
18eb0 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
18ec0 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
18ed0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
18ee0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
18ef0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18f00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
18f10 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
18f20 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
18f30 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
18f40 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
18f50 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
18f60 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
18f70 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
18f80 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
18f90 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
18fa0 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
18fb0 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
18fc0 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
18fd0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
18fe0 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
18ff0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
19000 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19010 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
19020 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19030 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19040 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19050 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19060 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19070 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19080 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19090 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
190a0 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
190b0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
190c0 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
190d0 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
190e0 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
190f0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
19100 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
19110 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
19120 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19140 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19150 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19160 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19170 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19180 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19190 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
191a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
191b0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
191c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
191d0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
191e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
191f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19200 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19210 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
19220 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19230 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19240 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19250 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19260 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19270 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19280 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19290 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
192a0 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
192b0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
192c0 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
192d0 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
192e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
192f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19300 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
19310 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
19320 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19330 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19340 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19350 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19360 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19370 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19380 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19390 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
193a0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
193b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
193c0 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
193d0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
193e0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
193f0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19400 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19410 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19420 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19430 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19440 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19450 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19460 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19470 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19480 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19490 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
194a0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
194b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
194c0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
194d0 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
194e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
194f0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19500 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
19510 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19520 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19530 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19540 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19550 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19580 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19590 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
195a0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
195b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
195c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
195d0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
195e0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
195f0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
19600 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
19610 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
19620 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19630 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
19640 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
19650 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
19660 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
19670 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
19680 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f  used used .** to
19690 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
196a0 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
196b0 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
196c0 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
196d0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
196e0 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
196f0 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
19700 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
19710 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
19720 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
19730 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
19740 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
19750 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
19760 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
19770 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
19780 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
19790 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
197a0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
197b0 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
197c0 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
197d0 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
197e0 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
197f0 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
19800 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
19810 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
19820 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
19830 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a  ECTOR_SIZE..**.*
19840 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
19850 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  s the SQLITE_IOC
19860 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
19870 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c  RWRITE property,
19880 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65   then set.** the
19890 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
198a0 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69  r size to its mi
198b0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32  nimum value (512
198c0 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  ).  The purpose 
198d0 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65  of.** pPager->se
198e0 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64  ctorSize is to d
198f0 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74  efine the "blast
19900 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65   radius" of byte
19910 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  s that.** might 
19920 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73  change if a cras
19930 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77  h occurs while w
19940 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  riting to a sing
19950 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68  le byte in.** th
19960 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77  at range.  But w
19970 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ith POWERSAFE_OV
19980 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61  ERWRITE, the bla
19990 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72  st radius is zer
199a0 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68  o.** (that is wh
199b0 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  at POWERSAFE_OVE
199c0 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73  RWRITE means), s
199d0 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  o we minimize th
199e0 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65  e sector.** size
199f0 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  .  For backwards
19a00 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
19a10 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
19a20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
19a30 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74  at,.** we cannot
19a40 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
19a50 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
19a60 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a  e below 512..*/.
19a70 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
19a80 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
19a90 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
19aa0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
19ab0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
19ac0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
19ad0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
19ae0 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c  pFile.   || (sql
19af0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
19b00 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
19b10 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20  er->fd) & .     
19b20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19b30 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
19b40 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20  OVERWRITE)!=0.  
19b50 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
19b60 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
19b70 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
19b80 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
19b90 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
19ba0 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
19bb0 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
19bc0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
19bd0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
19be0 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
19bf0 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20  segfault. */.   
19c00 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
19c10 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  ize = 512;.  }el
19c20 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
19c30 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
19c40 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
19c50 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
19c60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
19c70 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
19c80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63       pPager->sec
19c90 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
19ca0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
19cb0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
19cc0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
19cd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19ce0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19cf0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 20 20 70  >=512 );.      p
19d00 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
19d10 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  e = MAX_SECTOR_S
19d20 49 5a 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  IZE;.    }.  }.}
19d30 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
19d40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
19d50 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
19d60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19d70 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
19d80 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
19d90 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
19da0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
19db0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
19dc0 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
19dd0 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
19de0 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
19df0 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
19e00 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
19e10 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
19e20 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19e30 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19e40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
19e50 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
19e60 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
19e70 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
19e80 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
19e90 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
19ea0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
19eb0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
19ec0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
19ed0 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
19ee0 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
19ef0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19f00 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
19f10 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
19f20 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
19f30 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
19f40 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
19f50 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19f60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19f70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
19f80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
19f90 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
19fa0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
19fb0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
19fc0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19fd0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
19fe0 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
19ff0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1a000 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1a010 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1a020 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1a030 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a040 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1a050 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1a060 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1a070 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1a080 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1a090 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1a0a0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1a0b0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1a0c0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1a0d0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1a0e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1a0f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a100 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1a110 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1a120 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1a130 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1a140 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1a150 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1a160 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1a170 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1a180 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1a190 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1a1a0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1a1b0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1a1c0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1a1d0 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1a1e0 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1a1f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1a200 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1a210 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1a220 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1a230 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1a240 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1a250 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1a260 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a270 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1a280 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1a290 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1a2a0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1a2b0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1a2c0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1a2d0 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1a2e0 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1a2f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a300 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1a310 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1a320 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1a330 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1a340 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1a350 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1a360 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1a370 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1a380 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1a390 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1a3a0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1a3b0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1a3c0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1a3d0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1a3e0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1a3f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1a400 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1a410 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1a420 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1a430 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1a440 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1a450 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1a460 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1a470 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1a480 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1a490 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1a4a0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1a4b0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1a4c0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1a4d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1a4e0 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1a4f0 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1a500 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1a510 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1a520 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1a530 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1a540 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1a550 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1a560 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1a570 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1a580 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1a590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1a5a0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1a5b0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1a5c0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1a5d0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1a5e0 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1a5f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1a600 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1a610 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a620 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1a630 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1a640 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1a650 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1a660 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1a670 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1a680 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1a690 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1a6a0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1a6b0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1a6c0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1a6d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1a6e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a6f0 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1a700 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1a710 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1a720 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1a730 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1a740 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1a750 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1a760 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1a770 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1a780 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1a790 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1a7a0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1a7b0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1a7c0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1a7d0 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1a7e0 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1a7f0 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1a800 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1a810 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1a820 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1a830 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1a840 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1a850 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1a860 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1a870 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1a880 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1a890 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a8a0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a8b0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1a8e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1a8f0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1a900 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1a910 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a920 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1a930 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1a940 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1a950 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1a960 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1a970 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1a980 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1a990 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1a9a0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1a9b0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1a9e0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1a9f0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa10 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1aa20 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1aa30 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1aa40 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1aa50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1aa60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1aa70 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1aa80 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1aa90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1aaa0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1aab0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1aac0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1aad0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1aae0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1aaf0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1ab00 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1ab10 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1ab20 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1ab30 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1ab40 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1ab50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ab60 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1ab70 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1ab80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ab90 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1aba0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1abb0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1abc0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1abd0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1abe0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1abf0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1ac00 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1ac10 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1ac20 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1ac30 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1ac40 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1ac50 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1ac60 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1ac70 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1ac80 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1ac90 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1aca0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1acb0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1acc0 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1acd0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1ace0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1acf0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1ad00 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1ad10 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1ad20 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1ad30 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1ad40 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1ad50 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1ad60 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1ad70 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1ad80 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1ad90 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1ada0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1adb0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1adc0 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1add0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1ade0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1adf0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1ae00 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1ae10 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1ae20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1ae30 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1ae40 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1ae50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1ae60 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1ae70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1ae80 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1ae90 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1aea0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1aeb0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1aec0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1aed0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1aee0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1aef0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1af00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1af10 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1af20 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1af30 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1af40 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1af50 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1af60 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1af70 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1af80 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1af90 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1afa0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1afb0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1afc0 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1afd0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1afe0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1aff0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b010 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b020 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b030 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b050 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b060 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b070 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b080 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b090 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b0a0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b0b0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b0c0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b0d0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b0e0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b0f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b100 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b110 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b120 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b130 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b150 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b160 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b170 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b180 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b190 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b1a0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b1b0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b1c0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b1d0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b1e0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b1f0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b200 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1b210 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1b220 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1b230 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1b240 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1b250 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1b260 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1b270 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1b280 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1b290 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1b2a0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1b2b0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1b2c0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1b2d0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1b2e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b2f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b300 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b310 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1b320 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b330 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1b340 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1b350 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b370 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1b380 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1b390 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1b3a0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1b3b0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b3c0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b3d0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b3e0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b3f0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b400 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b410 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b420 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1b430 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1b440 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1b450 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1b460 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1b470 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1b480 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1b490 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1b4a0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1b4b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1b4c0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1b4d0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1b4e0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1b4f0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1b500 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1b510 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1b520 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1b530 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1b540 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1b550 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1b560 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1b570 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b580 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1b590 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1b5a0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1b5b0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1b5c0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1b5d0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1b5e0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1b5f0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b600 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1b610 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1b620 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1b630 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b640 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1b650 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1b660 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1b670 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1b680 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1b690 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1b6a0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1b6b0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1b6c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b6d0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1b6e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1b6f0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1b700 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1b710 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1b720 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b730 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1b740 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1b750 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b760 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1b770 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1b780 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b790 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1b7a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b7b0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1b7c0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1b7d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1b7e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b7f0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b800 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1b810 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1b820 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1b830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b850 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b860 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1b870 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1b880 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1b890 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1b8a0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1b8b0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1b8c0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1b8d0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1b8e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1b8f0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1b900 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1b910 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1b920 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1b930 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1b940 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1b950 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b960 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b970 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b980 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1b990 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b9a0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1b9b0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1b9c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b9d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b9e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b9f0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1ba00 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1ba10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1ba20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1ba30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1ba40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1ba50 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1ba60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ba70 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1ba80 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1ba90 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1baa0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1bab0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1bac0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1bad0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1bae0 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1baf0 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1bb00 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1bb10 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1bb20 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1bb30 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1bb40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1bb50 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1bb60 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1bb70 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1bb80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1bb90 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1bba0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1bbb0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1bbc0 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1bbd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1bbe0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1bbf0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1bc00 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1bc10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1bc20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1bc30 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1bc40 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1bc50 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1bc60 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1bc70 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1bc80 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1bc90 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1bca0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1bcb0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1bcc0 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1bcd0 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1bce0 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1bcf0 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1bd00 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1bd10 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1bd20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1bd30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1bd40 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1bd50 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1bd60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1bd70 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1bd80 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1bd90 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1bda0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1bdb0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1bdc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bdd0 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1bde0 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1bdf0 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1be00 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1be10 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1be20 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1be30 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1be40 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1be50 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1be60 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1be70 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1be80 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1be90 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1bea0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1beb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1bec0 42 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72  BUG.  if( pPager
1bed0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1bee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  {.    sqlite3OsF
1bef0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
1bf00 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
1bf10 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1bf20 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  GED,0);.  }.#end
1bf30 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  if..  /* If this
1bf40 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
1bf50 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
1bf60 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
1bf70 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
1bf80 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
1bf90 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
1bfa0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
1bfb0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
1bfc0 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
1bfd0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
1bfe0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
1bff0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
1c000 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
1c010 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
1c020 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
1c030 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
1c040 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
1c050 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
1c060 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
1c070 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
1c080 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
1c090 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
1c0a0 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
1c0b0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
1c0c0 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
1c0d0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
1c0e0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
1c0f0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
1c100 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
1c110 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
1c120 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1c130 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
1c140 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
1c150 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
1c160 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
1c170 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
1c180 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
1c190 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
1c1a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
1c1b0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1c1c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
1c1d0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1c1e0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
1c1f0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1c200 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1c210 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1c220 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1c230 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
1c240 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c250 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1c260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
1c270 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1c280 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1c290 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1c2a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1c2b0 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20  R_OPEN).  ){.   
1c2c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c2d0 65 72 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0a  erSync(pPager);.
1c2e0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c300 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1c310 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1c320 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1c330 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0');.    testcas
1c340 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1c350 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1c360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1c370 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
1c380 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1c390 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
1c3a0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
1c3b0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1c3c0 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
1c3d0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1c3e0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
1c3f0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1c400 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
1c410 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1c420 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
1c430 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1c440 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1c450 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
1c460 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
1c470 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1c480 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
1c490 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
1c4a0 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
1c4b0 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
1c4c0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1c4d0 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1c4e0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
1c4f0 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
1c500 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
1c510 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
1c520 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
1c530 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1c540 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1c550 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1c560 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
1c570 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
1c580 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c590 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
1c5a0 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
1c5b0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
1c5c0 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
1c5d0 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1c5e0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
1c5f0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1c600 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1c610 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
1c620 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
1c630 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
1c640 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
1c650 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
1c660 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
1c670 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1c680 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
1c690 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1c6a0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
1c6b0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1c6c0 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
1c6d0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
1c6e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1c6f0 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1c700 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
1c710 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1c720 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1c730 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
1c740 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1c750 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
1c760 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
1c770 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
1c780 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
1c790 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ead */.  int rc 
1c7a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1c7b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1c7c0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
1c7d0 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  InWal = 0;      
1c7e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c7f0 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67  f page is in log
1c800 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70   file */.  int p
1c810 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  gsz = pPager->pa
1c820 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65  geSize; /* Numbe
1c830 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
1c840 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
1c850 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1c860 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
1c870 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1c880 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1c890 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66  er->fd) );..  if
1c8a0 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28  ( NEVER(!isOpen(
1c8b0 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a  pPager->fd)) ){.
1c8c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c8d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1c8e0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
1c8f0 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
1c900 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c920 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  K;.  }..  if( pa
1c930 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1c940 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20  ) ){.    /* Try 
1c950 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65  to pull the page
1c960 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d   from the write-
1c970 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20  ahead log. */.  
1c980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1c990 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57  lRead(pPager->pW
1c9a0 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57  al, pgno, &isInW
1c9b0 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  al, pgsz, pPg->p
1c9c0 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Data);.  }.  if(
1c9d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c9e0 26 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20  & !isInWal ){.  
1c9f0 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
1ca00 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1ca10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1ca20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ca30 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1ca40 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1ca50 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
1ca60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ca70 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1ca80 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1ca90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1caa0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1cab0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1cac0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1cad0 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1cae0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1caf0 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1cb00 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1cb10 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1cb20 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1cb30 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1cb40 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1cb50 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1cb60 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1cb70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cb80 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1cb90 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1cba0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1cbb0 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1cbc0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1cbd0 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1cbe0 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1cbf0 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1cc00 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1cc10 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1cc20 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1cc30 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1cc40 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1cc50 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1cc60 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1cc70 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1cc80 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1cc90 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1cca0 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1ccb0 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1ccc0 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1ccd0 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1cce0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1ccf0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1cd00 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1cd10 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1cd20 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
1cd30 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1cd40 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1cd50 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1cd60 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1cd70 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1cd80 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1cd90 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1cda0 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1cdb0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1cdc0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1cdd0 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1cde0 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1cdf0 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1ce00 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1ce10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ce20 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1ce30 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1ce40 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1ce50 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1ce60 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1ce70 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1ce80 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
1ce90 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1cea0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1ceb0 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1cec0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1ced0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1cee0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1cef0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1cf00 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1cf10 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1cf20 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1cf30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1cf40 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1cf50 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1cf60 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1cf70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cf80 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1cf90 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1cfa0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1cfb0 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1cfc0 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1cfd0 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1cfe0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1cff0 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1d000 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1d010 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1d020 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1d030 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1d040 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1d050 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1d060 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1d070 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d080 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1d090 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1d0a0 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1d0b0 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1d0c0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1d0d0 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1d0e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d0f0 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1d100 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1d110 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1d120 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1d130 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1d140 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1d150 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1d160 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1d170 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1d180 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1d190 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1d1a0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1d1b0 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1d1c0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d1d0 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1d1e0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1d1f0 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1d200 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1d210 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1d220 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1d230 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1d240 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1d250 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1d260 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1d270 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1d280 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1d290 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1d2a0 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1d2b0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1d2c0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1d2d0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1d2e0 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1d2f0 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1d300 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d310 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1d320 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1d330 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1d340 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1d350 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1d360 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1d370 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1d380 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1d390 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1d3a0 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1d3b0 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1d3c0 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1d3d0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1d3e0 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1d3f0 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1d400 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1d410 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1d420 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1d430 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1d440 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1d450 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1d460 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1d470 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1d480 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1d490 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1d4a0 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1d4b0 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1d4c0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1d4d0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1d4e0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1d4f0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1d500 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1d510 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1d520 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1d530 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1d540 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1d550 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1d560 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1d570 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d580 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1d590 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1d5a0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1d5b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1d5c0 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1d5d0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1d5e0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
1d5f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1d600 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1d610 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1d620 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1d630 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1d640 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1d650 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1d660 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1d670 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1d680 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
1d690 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1d6a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1d6c0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1d6d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d6e0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1d6f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d700 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
1d710 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1d720 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
1d730 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
1d740 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
1d750 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
1d760 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
1d770 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1d780 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
1d790 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
1d7a0 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
1d7b0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
1d7c0 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
1d7d0 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
1d7e0 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
1d7f0 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
1d800 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
1d810 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
1d820 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
1d830 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
1d840 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1d850 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
1d860 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
1d870 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
1d880 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
1d890 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
1d8a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
1d8b0 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
1d8c0 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
1d8d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1d8e0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
1d8f0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
1d900 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1d910 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d920 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d930 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
1d940 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
1d950 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
1d960 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d970 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
1d980 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1d990 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d9b0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1d9c0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
1d9f0 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
1da00 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
1da10 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1da20 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
1da30 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1da40 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
1da50 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
1da60 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
1da70 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
1da80 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
1da90 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
1daa0 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
1dab0 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
1dac0 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
1dad0 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
1dae0 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
1daf0 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
1db00 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1db10 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
1db20 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1db30 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1db40 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1db50 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
1db60 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1db70 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
1db80 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
1db90 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
1dba0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1dbb0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1dbc0 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
1dbd0 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
1dbe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dbf0 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
1dc00 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1dc10 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1dc20 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
1dc30 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
1dc40 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
1dc50 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
1dc60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dc70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1dc80 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
1dc90 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
1dca0 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
1dcb0 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
1dcc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1dcd0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
1dce0 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
1dcf0 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
1dd00 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
1dd10 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
1dd20 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
1dd30 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1dd40 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
1dd50 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
1dd60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20  .**.** The list 
1dd70 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20  of pages passed 
1dd80 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
1dd90 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74  e is always sort
1dda0 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ed by page numbe
1ddb0 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20  r..** Hence, if 
1ddc0 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61  page 1 appears a
1ddd0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  nywhere on the l
1dde0 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ist, it will be 
1ddf0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a  the first page..
1de00 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
1de10 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
1de20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1de50 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1de60 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1de70 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1de80 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
1de90 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
1dea0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1deb0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1dec0 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
1ded0 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1dee0 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1def0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1df00 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1df10 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20   commit */.){.  
1df20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1df50 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20  /.  int nList;  
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1df80 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20   pages in pList 
1df90 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1dfa0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1dfb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1dfc0 48 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67  HECK_PAGES).  Pg
1dfd0 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dff0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1e000 72 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69  r pages */.#endi
1e010 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
1e020 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61  ger->pWal );.  a
1e030 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1e040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e050 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
1e060 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69  that the page li
1e070 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69  st is in accendi
1e080 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f  ng order */.  fo
1e090 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20  r(p=pList; p && 
1e0a0 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e  p->pDirty; p=p->
1e0b0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73  pDirty){.    ass
1e0c0 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70  ert( p->pgno < p
1e0d0 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29  ->pDirty->pgno )
1e0e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e0f0 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70  assert( pList->p
1e100 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f  Dirty==0 || isCo
1e110 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73  mmit );.  if( is
1e120 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  Commit ){.    /*
1e130 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61   If a WAL transa
1e140 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
1e150 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20  ommitted, there 
1e160 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77  is no point in w
1e170 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  riting.    ** an
1e180 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  y pages with pag
1e190 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
1e1a0 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65  r than nTruncate
1e1b0 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69   into the WAL fi
1e1c0 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20  le..    ** They 
1e1d0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65  will never be re
1e1e0 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  ad by any client
1e1f0 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d  . So remove them
1e200 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79   from the pDirty
1e210 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72  .    ** list her
1e220 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20  e. */.    PgHdr 
1e230 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a  *p;.    PgHdr **
1e240 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b  ppNext = &pList;
1e250 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a  .    nList = 0;.
1e260 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1e270 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d   (*ppNext = p)!=
1e280 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  0; p=p->pDirty){
1e290 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
1e2a0 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b  no<=nTruncate ){
1e2b0 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20  .        ppNext 
1e2c0 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = &p->pDirty;.  
1e2d0 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20        nList++;. 
1e2e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e2f0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1e300 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1e310 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  List = 1;.  }.  
1e320 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
1e330 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20  GER_STAT_WRITE] 
1e340 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28  += nList;..  if(
1e350 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
1e360 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
1e370 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
1e380 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  t);.  rc = sqlit
1e390 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  e3WalFrames(pPag
1e3a0 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20  er->pWal, .     
1e3b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e3c0 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63  e, pList, nTrunc
1e3d0 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70  ate, isCommit, p
1e3e0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
1e3f0 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
1e400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e410 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
1e420 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1e430 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1e440 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1e450 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e460 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1e470 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1e480 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1e490 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1e4a0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e4b0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1e4c0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1e4d0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1e4e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1e4f0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e500 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e510 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1e520 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1e530 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1e540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1e550 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1e560 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1e570 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e580 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1e590 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1e5a0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1e5b0 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1e5c0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1e5d0 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1e5e0 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1e5f0 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1e600 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1e610 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1e620 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1e630 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1e640 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1e650 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1e660 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1e670 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1e680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e690 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1e6a0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1e6b0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1e6c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e6e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e6f0 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e710 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1e720 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1e730 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1e740 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1e750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1e760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1e770 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1e780 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1e790 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1e7a0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1e7b0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1e7c0 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1e7d0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1e7e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1e7f0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1e800 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1e810 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1e820 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1e830 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1e840 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1e850 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1e860 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1e870 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1e880 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1e890 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1e8a0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1e8b0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1e8c0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1e8d0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1e8e0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1e8f0 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1e900 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1e910 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1e920 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1e930 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
1e940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e950 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1e960 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e970 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1e980 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1e990 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1e9a0 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1e9b0 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1e9c0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1e9d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e9e0 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1e9f0 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1ea00 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1ea10 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1ea20 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1ea30 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1ea40 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1ea50 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1ea60 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1ea70 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
1ea80 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
1ea90 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
1eaa0 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1eab0 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
1eac0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1ead0 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
1eae0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1eaf0 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
1eb00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1eb10 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1eb20 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1eb30 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
1eb40 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb60 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1eb70 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1eb80 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1eb90 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
1eba0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1ebb0 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
1ebc0 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
1ebd0 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
1ebe0 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
1ebf0 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
1ec00 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
1ec10 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
1ec20 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1ec30 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
1ec40 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1ec50 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
1ec60 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1ec70 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
1ec80 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
1ec90 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
1eca0 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
1ecb0 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
1ecc0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
1ecd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1ece0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1ecf0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1ed00 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1ed10 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e  ARED_LOCK );.  n
1ed20 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
1ed30 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
1ed40 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
1ed50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1ed60 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61  e was not availa
1ed70 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1ed80 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a   sub-system,.  *
1ed90 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62  * determine it b
1eda0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ased on the size
1edb0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1edc0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69   file. If the si
1edd0 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64  ze.  ** of the d
1ede0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1edf0 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d  not an integer m
1ee00 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70  ultiple of the p
1ee10 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72  age-size,.  ** r
1ee20 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65  ound down to the
1ee30 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45   nearest page. E
1ee40 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20  xcept, any file 
1ee50 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20  larger than 0.  
1ee60 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1ee70 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
1ee80 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  o contain at lea
1ee90 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a  st one page..  *
1eea0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
1eeb0 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1eec0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1eed0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1eee0 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1eef0 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1ef00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1ef10 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1ef20 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1ef30 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1ef40 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1ef50 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1ef60 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1ef70 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1ef80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ef90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1efa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1efb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1efc0 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
1efd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
1efe0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1eff0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
1f000 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1f010 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1f020 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1f030 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1f040 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1f050 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1f060 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1f070 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1f080 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1f090 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1f0a0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1f0b0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1f0c0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1f0d0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1f0e0 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1f0f0 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1f100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f110 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1f120 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1f130 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1f140 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1f150 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1f160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1f170 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1f180 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1f190 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1f1a0 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1f1b0 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1f1c0 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1f1d0 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1f1e0 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1f1f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1f200 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1f210 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1f220 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1f230 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1f240 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1f250 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1f260 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1f270 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1f280 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1f290 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1f2a0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1f2b0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1f2c0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1f2d0 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1f2e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1f2f0 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1f300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1f310 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1f320 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1f330 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1f340 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1f350 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1f360 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1f370 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1f380 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1f390 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1f3a0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1f3b0 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1f3c0 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1f3d0 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1f3e0 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1f3f0 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
1f400 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
1f410 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
1f420 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
1f430 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
1f440 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
1f450 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
1f460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f470 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
1f480 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
1f490 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1f4a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1f4b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f4c0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f4d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f4e0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1f4f0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
1f500 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1f510 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
1f520 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
1f530 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f540 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
1f550 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
1f560 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1f570 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f590 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
1f5a0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
1f5b0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
1f5c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1f5d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
1f5e0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1f5f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f600 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
1f610 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
1f620 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
1f630 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  isWal = 0;.    }
1f640 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f650 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1f660 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  (.          pPag
1f670 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1f680 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ->zWal, SQLITE_A
1f690 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69  CCESS_EXISTS, &i
1f6a0 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20  sWal.      );.  
1f6b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1f6c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f6d0 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
1f6e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f6f0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1f700 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
1f710 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
1f720 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f730 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
1f740 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
1f750 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
1f760 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1f770 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1f780 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
1f790 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1f7a0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
1f7b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
1f7c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1f7d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f7e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1f7f0 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
1f800 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
1f810 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
1f820 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
1f830 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
1f840 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
1f850 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
1f860 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
1f870 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
1f880 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
1f890 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
1f8a0 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
1f8b0 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
1f8c0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
1f8d0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
1f8e0 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
1f8f0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
1f900 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
1f910 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
1f920 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
1f930 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
1f940 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
1f950 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
1f960 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
1f970 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
1f980 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
1f990 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
1f9a0 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
1f9b0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
1f9c0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
1f9d0 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
1f9e0 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
1f9f0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
1fa00 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
1fa10 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
1fa20 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
1fa30 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
1fa40 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
1fa50 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
1fa60 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
1fa70 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
1fa80 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
1fa90 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
1faa0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
1fab0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1fac0 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
1fad0 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
1fae0 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
1faf0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1fb00 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1fb10 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
1fb20 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1fb30 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
1fb40 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
1fb50 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
1fb60 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
1fb70 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
1fb80 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
1fb90 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
1fba0 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
1fbb0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
1fbc0 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
1fbd0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
1fbe0 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
1fbf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1fc00 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
1fc10 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
1fc20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
1fc30 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
1fc40 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
1fc50 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
1fc60 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
1fc70 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
1fc80 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
1fc90 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
1fca0 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
1fcb0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1fcc0 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
1fcd0 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
1fce0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
1fcf0 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
1fd00 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
1fd10 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
1fd20 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
1fd30 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
1fd40 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
1fd50 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
1fd60 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
1fd70 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
1fd80 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
1fd90 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
1fda0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
1fdb0 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
1fdc0 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
1fdd0 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
1fde0 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
1fdf0 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
1fe00 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
1fe10 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
1fe20 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
1fe30 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
1fe40 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
1fe50 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
1fe60 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1fe70 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
1fe80 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
1fe90 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
1fea0 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
1feb0 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
1fec0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1fed0 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
1fee0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1fef0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1ff00 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
1ff10 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1ff20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
1ff30 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
1ff40 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
1ff50 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff70 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
1ff80 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
1ff90 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
1ffa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ffb0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
1ffc0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1ffd0 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
1ffe0 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
1fff0 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
20000 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
20010 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
20020 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20030 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
20040 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
20050 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
20060 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
20070 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
20080 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
20090 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
200a0 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
200b0 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
200c0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
200d0 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
200e0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
200f0 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
20100 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
20110 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
20120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20130 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
20140 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
20150 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
20160 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
20170 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
20180 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
20190 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
201a0 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
201b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
201c0 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
201d0 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
201e0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
201f0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
20200 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
20210 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20220 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
20230 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
20240 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20250 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
20260 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
20270 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
20280 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
20290 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
202a0 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
202b0 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
202c0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
202d0 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
202e0 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
202f0 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
20300 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20310 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
20320 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20330 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
20340 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
20350 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
20360 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
20370 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
20380 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
20390 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
203a0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
203b0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
203c0 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
203d0 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
203e0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
203f0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
20400 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
20410 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
20420 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20430 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
20440 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
20450 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
20460 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
20470 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
20480 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
20490 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
204a0 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
204b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
204c0 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
204d0 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
204e0 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
204f0 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
20500 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
20510 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
20520 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
20530 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
20540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
20550 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
20560 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20570 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
20580 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
20590 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
205a0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
205b0 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
205c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
205d0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
205e0 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
205f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20600 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
20610 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
20620 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20630 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
20640 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
20650 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
20660 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
20670 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20680 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
20690 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
206a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
206b0 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
206c0 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
206d0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
206e0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
206f0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20700 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
20710 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
20720 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
20730 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
20740 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
20750 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
20760 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
20770 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
20780 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
20790 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
207a0 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
207b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
207c0 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
207d0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
207e0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
207f0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
20800 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
20810 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20820 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
20830 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
20840 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
20850 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
20860 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
20870 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
20880 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
20890 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
208a0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
208b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
208c0 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
208d0 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
208e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
208f0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
20900 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
20910 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
20920 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
20930 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
20940 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
20950 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
20960 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
20970 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
20980 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
20990 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
209a0 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
209b0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
209c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
209d0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
209e0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
209f0 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
20a00 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
20a10 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
20a20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
20a30 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
20a40 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
20a50 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
20a60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
20a70 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
20a80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
20a90 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
20aa0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20ab0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20ac0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
20ad0 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
20ae0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20af0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20b00 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
20b10 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20b20 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
20b30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
20b40 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
20b50 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
20b60 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
20b70 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
20b80 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
20b90 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
20ba0 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
20bb0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
20bc0 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
20bd0 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
20be0 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
20bf0 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
20c00 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
20c10 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
20c20 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20c30 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
20c40 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
20c50 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
20c60 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76  fset = (i64)pSav
20c70 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
20c80 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
20c90 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
20ca0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20cb0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
20cc0 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
20cd0 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
20ce0 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
20cf0 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
20d00 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
20d10 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
20d20 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
20d30 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
20d40 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
20d50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
20d60 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34  fset==(i64)ii*(4
20d70 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
20d80 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
20d90 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
20da0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
20db0 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c   &offset, pDone,
20dc0 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
20dd0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20de0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
20df0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
20e00 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
20e10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20e20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
20e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
20e40 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   szJ;.  }..  ret
20e50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20e60 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
20e70 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
20e80 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
20e90 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
20ea0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
20eb0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
20ec0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20ed0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
20ee0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
20ef0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
20f00 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
20f10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
20f20 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
20f30 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
20f40 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76   the pager..*/.v
20f50 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
20f60 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50  Shrink(Pager *pP
20f70 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
20f80 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61  PcacheShrink(pPa
20f90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
20fa0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
20fb0 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
20fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
20fd0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
20fe0 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
20ff0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
21000 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
21010 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
21020 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
21030 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
21040 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
21050 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
21060 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
21070 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
21080 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
21090 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
210a0 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
210b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
210c0 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
210d0 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
210e0 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
210f0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
21100 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
21110 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
21120 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
21130 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
21140 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
21150 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
21160 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
21170 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
21180 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
21190 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
211a0 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
211b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
211c0 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
211d0 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
211e0 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
211f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
21200 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
21210 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
21220 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
21230 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
21240 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
21250 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
21260 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
21270 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
21280 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
21290 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
212a0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
212c0 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
212d0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
212e0 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
212f0 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
21300 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
21310 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
21320 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
21330 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
21340 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
21350 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
21360 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
21370 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
21380 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
21390 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
213a0 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
213b0 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
213d0 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
213e0 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
213f0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
21400 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
21410 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
21420 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
21430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
21440 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
21450 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
21460 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b  s for a rollback
21470 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20  -journal mode.  
21480 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46  For WAL mode, OF
21490 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74  F continues.** t
214a0 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73  o mean that no s
214b0 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e  yncs ever occur.
214c0 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74    NORMAL means t
214d0 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73  hat the WAL is s
214e0 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  ynced.** prior t
214f0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
21500 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68  heckpoint and th
21510 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
21520 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a  file is synced.*
21530 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
21540 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ion of the check
21550 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74  point if the ent
21560 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ire content of t
21570 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72  he WAL.** was wr
21580 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
21590 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
215a0 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61  ut no sync opera
215b0 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a  tions occur for.
215c0 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63  ** an ordinary c
215d0 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20  ommit in NORMAL 
215e0 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20  mode with WAL.  
215f0 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  FULL means that 
21600 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20  the WAL.** file 
21610 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  is synced follow
21620 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20  ing each commit 
21630 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64  operation, in ad
21640 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  dition to the.**
21650 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65   syncs associate
21660 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a  d with NORMAL..*
21670 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66  *.** Do not conf
21680 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  use synchronous=
21690 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45  FULL with SQLITE
216a0 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65  _SYNC_FULL.  The
216b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  .** SQLITE_SYNC_
216c0 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73  FULL macro means
216d0 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f   to use the MacO
216e0 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73  SX-style full-fs
216f0 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e  ync.** using fcn
21700 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e  tl(F_FULLFSYNC).
21710 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f    SQLITE_SYNC_NO
21720 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f  RMAL means to do
21730 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
21740 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54  fsync() call.  T
21750 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
21760 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51  rence between SQ
21770 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a  LITE_SYNC_FULL.*
21780 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e  * and SQLITE_SYN
21790 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74  C_NORMAL on plat
217a0 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e  forms other than
217b0 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68   MacOSX.  But th
217c0 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73  e.** synchronous
217d0 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e  =FULL versus syn
217e0 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
217f0 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e  setting determin
21800 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78  es when.** the x
21810 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69  Sync primitive i
21820 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20  s called and is 
21830 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20  relevant to all 
21840 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a  platforms..**.**
21850 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
21860 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
21870 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
21880 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
21890 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
218a0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
218b0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
218c0 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
218d0 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
218e0 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72 20  yLevel(.  Pager 
218f0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
21900 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20  /* The pager to 
21910 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c  set safety level
21920 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   for */.  int le
21930 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
21940 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72  /* PRAGMA synchr
21950 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32  onous.  1=OFF, 2
21960 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20  =NORMAL, 3=FULL 
21970 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c  */  .  int bFull
21980 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20  Fsync,       /* 
21990 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
219a0 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74 46   */.  int bCkptF
219b0 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20 50  ullFsync    /* P
219c0 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
219d0 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b  _fullfsync */.){
219e0 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c  .  assert( level
219f0 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20  >=1 && level<=3 
21a00 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
21a10 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
21a20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
21a30 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
21a40 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
21a50 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
21a60 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
21a70 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61   ?1:0;.  if( pPa
21a80 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
21a90 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
21aa0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50  lags = 0;.    pP
21ab0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21ac0 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
21ad0 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63 20   if( bFullFsync 
21ae0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
21af0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
21b00 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20  E_SYNC_FULL;.   
21b10 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
21b20 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
21b30 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
21b40 73 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c 6c  se if( bCkptFull
21b50 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  Fsync ){.    pPa
21b60 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
21b70 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21b80 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
21b90 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
21ba0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
21bb0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
21bc0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
21bd0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21be0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
21bf0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
21c00 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21c10 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50  NORMAL;.  }.  pP
21c20 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
21c30 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  gs = pPager->syn
21c40 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50  cFlags;.  if( pP
21c50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
21c60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  {.    pPager->wa
21c70 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41  lSyncFlags |= WA
21c80 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
21c90 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ONS;.  }.}.#endi
21ca0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
21cb0 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
21cc0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
21cd0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
21ce0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
21cf0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
21d00 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
21d10 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
21d20 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
21d30 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
21d40 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
21d50 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21d60 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
21d70 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
21d80 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
21d90 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
21da0 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
21db0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
21dc0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
21dd0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
21de0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
21df0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
21e00 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
21e10 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
21e20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
21e30 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
21e40 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
21e50 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
21e60 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
21e70 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
21e80 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
21e90 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
21ea0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
21eb0 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
21ec0 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
21ed0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
21ee0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
21ef0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
21f00 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
21f10 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
21f20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
21f30 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
21f40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
21f50 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
21f60 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
21f70 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
21f80 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
21f90 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
21fa0 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
21fb0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
21fc0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
21fd0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
21fe0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
21ff0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
22000 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
22010 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
22020 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
22030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22040 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
22050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22060 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
22070 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
22080 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
22090 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
220a0 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
220b0 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
220c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
220d0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
220e0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
220f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
22100 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
22110 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
22120 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
22130 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
22140 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
22150 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
22160 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
22170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
22180 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
22190 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
221a0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
221b0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
221c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
221d0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
221e0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
221f0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
22200 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
22210 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
22220 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
22230 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
22240 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
22250 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
22260 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
22270 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
22280 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
22290 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
222a0 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
222b0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
222c0 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
222d0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
222e0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
222f0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
22300 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
22310 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
22320 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
22330 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
22340 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
22350 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
22360 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
22370 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
22380 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
22390 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
223a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
223b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
223c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
223d0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
223e0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
223f0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
22400 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
22410 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
22420 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
22430 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
22440 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
22450 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
22460 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
22470 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
22480 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
22490 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
224a0 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
224b0 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
224c0 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
224d0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
224e0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
224f0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
22500 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
22510 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
22520 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
22530 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
22540 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
22550 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
22560 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
22590 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
225a0 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
225b0 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
225c0 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
225d0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
225e0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
225f0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
22600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
22610 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
22620 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
22630 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
22640 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
22650 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
22660 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
22670 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
22680 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
22690 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
226a0 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
226b0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
226c0 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
226d0 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
226e0 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
226f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
22700 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
22710 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
22720 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22730 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
22740 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
22750 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
22760 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
22770 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
22780 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
22790 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c  TE_IOERR, an SQL
227a0 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75  ITE_IOERR_xxx su
227b0 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45  b-code or SQLITE
227c0 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
227d0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
227e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
227f0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
22800 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
22810 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
22820 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
22830 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
22840 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
22850 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
22860 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
22870 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
22880 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
22890 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
228a0 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
228b0 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
228c0 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
228d0 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
228e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
228f0 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
22900 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
22910 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
22920 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
22930 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
22940 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
22950 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
22960 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
22970 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
22980 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
22990 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
229a0 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
229b0 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
229c0 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
229d0 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
229e0 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
229f0 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
22a00 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
22a10 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
22a20 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
22a30 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
22a40 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
22a50 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
22a60 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
22a70 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
22a80 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
22a90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
22aa0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
22ab0 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
22ac0 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
22ad0 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
22ae0 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
22af0 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
22b00 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
22b10 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
22b20 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
22b30 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
22b40 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
22b50 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
22b60 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
22b70 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
22b80 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
22b90 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
22ba0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
22bb0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
22bc0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
22bd0 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
22be0 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65  ager, u32 *pPage
22bf0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
22c00 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
22c10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
22c20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
22c30 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c  ble to do a full
22c40 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
22c50 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74  ate() here, as t
22c60 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
22c70 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
22c80 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65  from within Page
22c90 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20  rOpen(), before 
22ca0 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f  the state.  ** o
22cb0 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
22cc0 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ct is internally
22cd0 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
22ce0 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f  *.  ** At one po
22cf0 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  int this functio
22d00 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  n returned an er
22d10 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72  ror if the pager
22d20 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41   was in .  ** PA
22d30 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
22d40 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52   But since PAGER
22d50 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61  _ERROR state gua
22d60 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a  rantees that.  *
22d70 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65  * there is at le
22d80 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
22d90 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
22da0 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ce, this functio
22db0 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  n.  ** is a no-o
22dc0 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  p for that case 
22dd0 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20  anyhow..  */..  
22de0 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u32 pageSize = *
22df0 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
22e00 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
22e10 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
22e20 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
22e30 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
22e40 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28  SIZE) );.  if( (
22e50 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
22e60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
22e70 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c  ze==0).   && sql
22e80 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
22e90 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
22ea0 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61  he)==0 .   && pa
22eb0 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
22ec0 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d  ze!=(u32)pPager-
22ed0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
22ee0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
22ef0 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
22f00 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
22f10 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  pace */.    i64 
22f20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  nByte = 0;..    
22f30 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
22f40 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  te>PAGER_OPEN &&
22f50 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
22f60 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  fd) ){.      rc 
22f70 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
22f80 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
22f90 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20  &nByte);.    }. 
22fa0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22fb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e  E_OK ){.      pN
22fc0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
22fd0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
22fe0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
22ff0 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d  if( !pNew ) rc =
23000 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23010 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
23020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23030 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
23040 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
23050 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
23060 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70   (Pgno)((nByte+p
23070 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53  ageSize-1)/pageS
23080 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
23090 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
230a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
230b0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
230c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
230d0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
230e0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
230f0 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
23100 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
23110 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
23120 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
23130 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
23140 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
23150 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
23160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23170 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
23180 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
23190 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
231a0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
231b0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
231c0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
231d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
231e0 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
231f0 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
23200 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
23210 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23220 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23230 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23240 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
23250 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
23260 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
23270 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
23280 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
23290 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
232a0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
232b0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
232c0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
232d0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
232e0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
232f0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
23300 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
23310 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
23320 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
23330 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
23340 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
23350 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
23360 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
23370 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
23380 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
23390 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
233a0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
233b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
233c0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
233d0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
233e0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
233f0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
23400 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
23410 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
23420 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
23430 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
23440 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
23450 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
23460 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
23470 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
23480 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
23490 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
234a0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
234b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
234c0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
234d0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
234e0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
234f0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
23500 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
23510 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
23520 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
23530 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
23540 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
23550 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
23560 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23570 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
23580 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
23590 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
235a0 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
235b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
235c0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
235d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
235e0 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
235f0 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
23600 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
23610 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
23620 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23630 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
23640 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
23650 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
23660 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
23670 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
23680 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
23690 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
236a0 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
236b0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
236c0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
236d0 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
236e0 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
236f0 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
23700 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
23710 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
23720 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
23730 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
23740 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
23750 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
23760 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
23770 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
23780 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
23790 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
237a0 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
237b0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
237c0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
237d0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
237e0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
237f0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
23800 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
23810 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
23820 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
23830 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
23840 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
23850 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
23860 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
23870 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
23880 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
23890 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
238a0 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
238b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
238c0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
238d0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
238e0 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
238f0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
23900 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
23910 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
23920 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
23930 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
23940 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
23950 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
23960 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
23970 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
23980 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
23990 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
239a0 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
239b0 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
239c0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
239d0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
239e0 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
239f0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
23a00 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
23a10 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
23a20 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
23a30 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
23a40 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
23a50 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
23a60 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
23a70 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
23a80 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
23a90 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
23aa0 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
23ab0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
23ac0 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
23ad0 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
23ae0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
23af0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
23b00 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
23b10 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
23b20 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
23b30 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
23b40 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
23b50 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
23b60 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
23b70 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
23b80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
23b90 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
23ba0 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
23bb0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
23bc0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
23bd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
23be0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
23bf0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
23c00 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
23c10 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
23c20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
23c30 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
23c40 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
23c50 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
23c60 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
23c70 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
23c80 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
23c90 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
23ca0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
23cb0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
23cc0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
23cd0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
23ce0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
23cf0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
23d00 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
23d10 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
23d20 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
23d30 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
23d40 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
23d50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23d60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
23d70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23d80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
23d90 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
23da0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
23db0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
23dc0 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
23dd0 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
23de0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
23df0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
23e00 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
23e10 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
23e20 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
23e30 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
23e40 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
23e50 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
23e60 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
23e70 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
23e80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
23e90 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
23ea0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23eb0 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
23ec0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
23ed0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
23ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
23ef0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
23f00 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
23f10 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
23f20 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
23f30 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
23f40 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
23f50 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
23f60 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
23f70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
23f80 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
23f90 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
23fa0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
23fb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23fc0 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
23fd0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
23fe0 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
23ff0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
24000 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
24010 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
24020 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
24030 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
24040 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
24050 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
24060 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
24070 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
24080 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
24090 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
240a0 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
240b0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
240c0 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
240d0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
240e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
240f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
24100 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
24110 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
24120 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
24130 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
24140 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
24150 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
24160 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
24170 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
24180 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
24190 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
241a0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
241b0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
241c0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
241d0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24200 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
24210 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
24220 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
24230 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
24240 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
24250 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
24260 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
24270 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
24280 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
24290 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
242a0 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
242b0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
242c0 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
242d0 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
242e0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
242f0 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
24300 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
24310 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
24320 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
24330 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
24340 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
24350 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
24360 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
24370 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
24380 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
24390 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
243a0 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
243b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
243c0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
243d0 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
243e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
243f0 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
24400 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
24410 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
24420 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
24430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
24440 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
24450 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
24460 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
24470 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
24480 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
24490 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
244a0 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
244b0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
244c0 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
244d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
244e0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
244f0 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
24500 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
24510 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
24520 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
24530 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
24540 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
24550 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
24560 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
24570 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
24580 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
24590 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
245a0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
245b0 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
245c0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
245d0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
245e0 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
245f0 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
24600 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
24610 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
24620 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
24630 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
24640 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
24650 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
24660 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
24670 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
24680 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
24690 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
246a0 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
246b0 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
246c0 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
246d0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
246e0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
246f0 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
24700 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
24710 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
24720 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
24730 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
24740 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  our would be to 
24750 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
24760 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
24770 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
24780 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
24790 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
247a0 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
247b0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
247c0 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
247d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
247e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
247f0 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
24800 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
24810 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
24820 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
24830 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
24840 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
24850 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
24860 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
24870 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
24880 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
24890 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
248a0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
248b0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
248c0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
248d0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
248e0 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
248f0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
24900 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
24910 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
24920 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
24930 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
24940 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
24950 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
24960 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
24970 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
24980 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
24990 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
249a0 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
249b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
249c0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
249d0 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
249e0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
249f0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24a00 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
24a10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
24a20 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
24a30 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
24a40 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
24a50 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
24a60 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
24a70 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
24a80 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
24a90 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
24aa0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
24ab0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
24ac0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
24ad0 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
24ae0 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
24af0 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
24b00 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
24b10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
24b20 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
24b30 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
24b40 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
24b50 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
24b60 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
24b70 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
24b80 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
24b90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24ba0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
24bb0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
24bc0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
24bd0 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74   nPage;.  assert
24be0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24bf0 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a  nt(pPager);.}...
24c00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24c10 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
24c20 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
24c30 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
24c40 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
24c50 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
24c60 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
24c70 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
24c80 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
24c90 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
24ca0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
24cb0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
24cc0 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
24cd0 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
24ce0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
24cf0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
24d00 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
24d10 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
24d20 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
24d30 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
24d40 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
24d50 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
24d60 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
24d70 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
24d80 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
24d90 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
24da0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
24db0 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
24dc0 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
24dd0 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
24de0 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
24df0 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
24e00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
24e10 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
24e20 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
24e30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
24e40 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
24e50 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
24e60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24e70 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
24e80 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
24e90 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
24ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
24eb0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
24ec0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
24ed0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
24ee0 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
24ef0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
24f00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24f10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
24f20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
24f30 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
24f40 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
24f50 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
24f60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24f70 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
24f80 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
24f90 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
24fa0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
24fb0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
24fc0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
24fd0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
24fe0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
24ff0 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
25000 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
25010 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
25020 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
25030 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
25040 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
25050 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
25060 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
25070 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
25080 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
25090 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
250a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
250b0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
250c0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
250d0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
250e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
250f0 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
25100 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
25110 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
25120 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
25130 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
25140 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
25150 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
25160 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
25170 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
25180 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
25190 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
251a0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
251b0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
251c0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
251d0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
251e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
251f0 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
25200 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
25210 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73  e;..  assert( as
25220 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
25230 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
25240 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
25250 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
25260 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
25270 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20  nMalloc();.  /* 
25280 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
25290 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
252a0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
252b0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
252c0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
252d0 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
252e0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
252f0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
25300 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
25310 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70  Size, pTmp);.  p
25320 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
25330 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
25340 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
25350 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
25360 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
25370 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
25380 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
25390 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
253a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
253b0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
253c0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
253d0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
253e0 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
253f0 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
25400 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
25410 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
25420 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
25430 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
25440 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
25450 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
25460 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
25470 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
25480 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
25490 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
254a0 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
254b0 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
254c0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
254d0 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
254e0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
254f0 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
25500 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
25510 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
25520 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
25530 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
25540 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
25550 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
25560 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25570 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
25580 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
25590 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
255a0 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
255b0 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
255c0 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
255d0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
255e0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
255f0 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
25600 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25620 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
25630 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
25640 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
25650 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
25660 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
25670 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
25680 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
25690 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
256a0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
256b0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
256c0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
256d0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
256e0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
256f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
25700 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
25710 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
25720 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
25730 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
25740 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
25750 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
25760 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
25770 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
25780 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
25790 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
257a0 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
257b0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
257c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
257d0 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
257e0 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
257f0 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
25800 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
25810 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
25820 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
25830 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
25840 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
25850 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
25860 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
25870 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
25880 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
25890 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
258a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
258b0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
258c0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
258d0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
258e0 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
258f0 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
25900 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
25910 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
25920 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
25930 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
25940 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
25950 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
25960 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
25970 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
25980 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25990 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
259a0 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
259b0 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
259c0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
259d0 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
259e0 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
259f0 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
25a00 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
25a10 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
25a20 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
25a30 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
25a40 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
25a50 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
25a60 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
25a70 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
25a80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
25a90 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
25aa0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
25ab0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
25ac0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
25ad0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
25ae0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
25af0 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
25b00 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
25b10 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
25b20 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
25b30 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
25b40 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
25b50 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
25b60 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
25b70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25b80 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
25b90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
25ba0 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
25bb0 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
25bc0 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
25bd0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
25be0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
25bf0 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
25c00 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
25c10 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
25c20 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
25c30 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
25c40 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
25c50 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
25c60 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
25c70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
25c80 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
25c90 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
25ca0 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
25cb0 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
25cc0 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
25cd0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
25ce0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
25cf0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
25d00 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
25d10 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
25d20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
25d30 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
25d40 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
25d50 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
25d60 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
25d70 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
25d80 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
25d90 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
25da0 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
25db0 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
25dc0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
25dd0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
25de0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
25df0 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
25e00 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
25e10 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
25e20 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
25e30 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
25e40 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
25e50 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
25e60 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
25e70 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
25e80 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
25e90 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
25ea0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
25eb0 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
25ec0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
25ed0 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
25ee0 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
25ef0 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
25f00 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
25f10 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
25f20 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
25f30 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
25f40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
25f50 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
25f60 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
25f70 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
25f80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25f90 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
25fa0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25fc0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25fd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25fe0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
25ff0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
26000 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
26010 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
26020 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
26030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
26040 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
26050 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
26060 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
26070 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
26080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26090 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
260a0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
260b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
260c0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
260d0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
260e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
260f0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
26100 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
26110 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26120 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
26130 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
26140 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
26150 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
26160 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
26170 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
26180 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
26190 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
261a0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
261b0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
261c0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
261d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
261e0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
261f0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
26200 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
26210 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
26220 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
26230 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
26240 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
26250 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
26260 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
26270 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
26280 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
26290 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
262a0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
262b0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
262c0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
262d0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
262e0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
262f0 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
26300 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
26310 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
26320 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
26330 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
26340 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
26350 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
26360 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
26370 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
26380 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
26390 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
263a0 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
263b0 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
263c0 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
263d0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
263e0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
263f0 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
26400 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
26410 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
26420 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
26430 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
26440 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
26450 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
26460 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
26470 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
26480 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
26490 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
264a0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
264b0 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
264c0 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
264d0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
264e0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
264f0 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
26500 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
26510 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
26520 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
26530 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
26540 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
26550 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
26560 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26570 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
26580 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
26590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
265a0 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
265b0 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
265c0 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
265d0 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
265e0 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
265f0 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
26600 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
26610 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
26620 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
26630 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
26640 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
26650 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
26660 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
26670 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
26680 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
26690 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
266a0 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
266b0 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
266c0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
266d0 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
266e0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
266f0 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
26700 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
26710 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
26720 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
26730 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
26740 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
26750 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26760 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
26770 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
26780 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
26790 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
267a0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
267b0 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
267c0 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
267d0 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
267e0 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
267f0 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
26800 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
26810 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
26820 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
26830 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
26840 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
26850 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
26860 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
26870 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26880 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
26890 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
268a0 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
268b0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
268c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
268d0 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
268e0 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
268f0 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
26900 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
26910 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
26920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26930 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
26940 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
26950 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
26960 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
26970 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26980 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
26990 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
269a0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
269b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
269c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
269d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
269e0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
269f0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
26a00 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
26a10 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
26a20 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
26a30 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
26a40 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
26a50 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
26a60 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
26a70 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
26a80 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
26a90 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
26aa0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
26ab0 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
26ac0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
26ad0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
26ae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
26af0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
26b00 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
26b10 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
26b20 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
26b30 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
26b40 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
26b50 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
26b60 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
26b70 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
26b80 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
26b90 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
26ba0 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
26bb0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
26bc0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
26bd0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
26be0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
26bf0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
26c00 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
26c10 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
26c20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
26c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
26c40 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
26c50 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
26c60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
26c70 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
26c80 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
26c90 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
26ca0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
26cb0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
26cc0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
26cd0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
26ce0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
26cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26d00 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26d10 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
26d20 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
26d30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26d40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
26d60 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
26d70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
26d80 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
26d90 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
26da0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
26db0 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
26dc0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
26dd0 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
26de0 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
26df0 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
26e00 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
26e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26e20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26e30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
26e40 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
26e50 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
26e60 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
26e70 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
26e80 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
26e90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
26ea0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
26eb0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
26ec0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
26ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26ee0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
26ef0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
26f00 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
26f10 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
26f20 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
26f30 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
26f40 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
26f50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
26f60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26f70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
26f80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
26f90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
26fa0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
26fb0 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
26fc0 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
26fd0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
26fe0 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
26ff0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
27000 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
27010 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
27020 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
27030 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27040 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
27050 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
27060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27070 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
27080 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
27090 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
270a0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
270b0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
270c0 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
270d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
270e0 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
270f0 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
27100 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
27110 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
27120 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
27130 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
27140 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
27150 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
27160 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
27170 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
27180 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
27190 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
271a0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
271b0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
271c0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
271d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
271e0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
271f0 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
27200 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
27210 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
27220 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
27230 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
27240 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
27250 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
27260 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
27270 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
27280 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
27290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
272a0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
272b0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
272c0 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
272d0 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
272e0 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
272f0 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
27300 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
27310 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
27320 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
27330 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
27340 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
27350 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
27360 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
27370 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
27380 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
27390 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
273a0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
273b0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
273c0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
273d0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
273e0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
273f0 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
27400 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
27410 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
27420 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
27430 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
27440 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
27450 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
27460 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
27470 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
27480 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
27490 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
274a0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
274b0 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
274c0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
274d0 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
274e0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
274f0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
27500 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
27510 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
27520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27530 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
27540 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
27550 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
27560 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
27570 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
27580 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
27590 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
275a0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
275b0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
275c0 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
275d0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
275e0 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
275f0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
27600 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
27610 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
27620 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27630 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
27640 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
27650 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
27660 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
27670 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
27680 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
27690 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
276a0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
276b0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
276c0 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
276d0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
276e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
276f0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
27700 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
27710 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
27720 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
27730 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
27740 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
27750 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
27760 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
27770 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
27780 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
27790 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
277a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
277b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
277c0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
277d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
277e0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
277f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27800 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
27810 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27820 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
27830 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
27840 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
27850 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
27860 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
27870 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
27880 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
27890 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
278a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
278b0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
278c0 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
278d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
278e0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
278f0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
27900 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
27910 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
27920 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
27930 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
27940 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
27950 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
27960 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
27970 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
27980 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
27990 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
279a0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
279b0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
279c0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
279d0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
279e0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
279f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
27a00 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
27a10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
27a20 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
27a30 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
27a40 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
27a50 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
27a60 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
27a70 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
27a80 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
27a90 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
27aa0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
27ab0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
27ac0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
27ad0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
27ae0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
27af0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27b00 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  OK && pPager->db
27b10 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 48  Size>pPager->dbH
27b20 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 73  intSize ){.    s
27b30 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
27b40 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
27b50 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
27b60 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
27b70 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
27b80 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
27b90 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
27ba0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
27bb0 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65  ZE_HINT, &szFile
27bc0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
27bd0 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
27be0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
27bf0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
27c00 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
27c10 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
27c20 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
27c30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
27c40 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
27c50 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
27c60 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
27c70 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
27c80 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
27c90 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
27ca0 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
27cb0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
27cc0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
27cd0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
27ce0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
27cf0 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
27d00 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
27d10 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
27d20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
27d30 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
27d40 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
27d50 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
27d60 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
27d70 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
27d80 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
27d90 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
27da0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
27db0 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
27dc0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
27dd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
27de0 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
27df0 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
27e00 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
27e10 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
27e20 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
27e30 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
27e40 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
27e50 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
27e60 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74         /* Data t
27e90 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
27ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
27eb0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
27ec0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
27ed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
27ee0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
27ef0 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
27f00 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
27f10 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
27f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
27f30 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
27f40 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
27f50 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
27f60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27f70 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
27f80 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
27f90 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
27fa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27fb0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
27fc0 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
27fd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
27fe0 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
27ff0 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
28000 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
28010 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
28020 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
28030 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
28040 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
28050 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28060 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
28070 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
28080 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
28090 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
280a0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
280b0 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
280c0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
280d0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
280e0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
280f0 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
28100 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
28110 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
28120 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28130 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
28140 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
28150 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28160 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
28170 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
28180 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
28190 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
281a0 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ++;..      /* Up
281b0 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
281c0 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
281d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
281e0 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
281f0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
28200 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
28210 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
28220 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
28230 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
28240 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
28250 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
28260 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
28270 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
28280 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
28290 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
282a0 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
282b0 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
282c0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
282d0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
282e0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
282f0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
28300 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65  b_count);.    }e
28310 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
28320 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
28330 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
28340 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
28350 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
28360 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
28370 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
28380 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
28390 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
283a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
283b0 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
283c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
283d0 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
283e0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
283f0 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
28400 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
28410 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
28420 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
28430 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
28440 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
28450 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
28460 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
28470 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
28480 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
28490 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
284a0 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
284b0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
284c0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
284d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
284e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
284f0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
28500 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
28510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
28520 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
28530 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
28540 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
28550 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
28560 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
28570 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
28580 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  ->sjfd);.    }el
28590 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
285a0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
285b0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
285c0 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
285d0 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
285e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
285f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
28600 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
28610 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
28620 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
28630 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
28640 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63   .** It is the c
28650 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
28660 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62  ility to use sub
28670 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20  jRequiresPage() 
28680 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61  to check .** tha
28690 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  t it is really r
286a0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63  equired before c
286b0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
286c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tion..**.** If s
286d0 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
286e0 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
286f0 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e  ding to pPg->pgn
28700 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73  o in the bitvecs
28710 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e  .** for all open
28720 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f   savepoints befo
28730 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
28740 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
28750 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
28760 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
28770 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
28780 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
28790 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65  code if the atte
287a0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
287b0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
287c0 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51  fails, or .** SQ
287d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
287e0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69  malloc fails whi
287f0 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74  le setting a bit
28800 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a   in a savepoint.
28810 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74  ** bitvec..*/.st
28820 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
28830 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70  nalPage(PgHdr *p
28840 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
28850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
28860 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
28870 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
28880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
28890 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
288a0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20  ALMODE_OFF ){.. 
288b0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
288c0 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  ub-journal, if i
288d0 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
288e0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f  y been opened */
288f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28900 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
28910 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
28920 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
28930 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  d) || pagerUseWa
28940 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
28950 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
28960 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c  pPager->sjfd) ||
28970 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
28980 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
28990 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
289a0 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20  Pager) .        
289b0 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61   || pageInJourna
289c0 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  l(pPg) .        
289d0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
289e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
289f0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
28a00 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
28a10 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
28a20 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
28a30 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
28a40 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
28a50 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
28a60 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
28a70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
28a80 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
28a90 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
28aa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28ab0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
28ac0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
28ad0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
28ae0 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
28af0 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
28b00 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
28b10 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
28b20 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
28b30 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
28b40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
28b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28b60 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
28b70 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28b80 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
28b90 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
28ba0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
28bb0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
28bc0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
28bd0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
28be0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
28bf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
28c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28c10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28c20 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
28c30 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
28c40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28c50 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
28c60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
28c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28c80 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
28c90 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
28ca0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28cb0 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
28cc0 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
28cd0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
28ce0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
28cf0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
28d00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
28d10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
28d20 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
28d30 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
28d40 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
28d50 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
28d60 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
28d70 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
28d80 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
28d90 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
28da0 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
28db0 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
28dc0 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
28dd0 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
28de0 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
28df0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
28e00 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
28e10 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
28e20 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
28e30 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
28e40 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
28e50 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
28e60 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
28e70 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
28e80 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
28e90 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
28ea0 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
28eb0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
28ec0 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
28ed0 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
28ee0 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
28ef0 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
28f00 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
28f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
28f20 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
28f30 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
28f40 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
28f50 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
28f60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
28f70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
28f80 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
28f90 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
28fa0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
28fb0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
28fc0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
28fd0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
28fe0 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
28ff0 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
29000 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
29010 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
29020 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
29030 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
29040 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
29050 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
29060 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
29070 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
29080 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
29090 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
290a0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
290b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
290c0 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
290d0 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
290e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
290f0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
29100 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29110 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
29120 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
29130 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
29140 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
29150 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
29160 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69  The doNotSyncSpi
29170 6c 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64  ll flag is set d
29180 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
29190 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
291a0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
291b0 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
291c0 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
291d0 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
291e0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
291f0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
29200 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
29210 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
29220 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
29230 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
29240 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
29250 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
29260 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
29270 20 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61   flag inhibits a
29280 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
29290 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  g regardless of 
292a0 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20  whether.  ** or 
292b0 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
292c0 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
292d0 20 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f   set during a ro
292e0 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  llback..  **.  *
292f0 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c  * Spilling is al
29300 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68  so prohibited wh
29310 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  en in an error s
29320 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20  tate since that 
29330 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20  could.  ** lead 
29340 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
29350 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65  uption.   In the
29360 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
29370 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20  ntaton it .  ** 
29380 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
29390 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  r sqlite3PcacheF
293a0 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c  etch() to be cal
293b0 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46  led with createF
293c0 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c  lag==1.  ** whil
293d0 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  e in the error s
293e0 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69  tate, hence it i
293f0 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
29400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
29410 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
29420 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
29430 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  te.  Nevertheles
29440 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20  s, we include a 
29450 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73  NEVER().  ** tes
29460 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20  t for the error 
29470 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67  state as a safeg
29480 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74  uard against fut
29490 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a  ure changes..  *
294a0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
294b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
294c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
294d0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
294e0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65  >doNotSpill ) re
294f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29500 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
29510 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20  NotSyncSpill && 
29520 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
29530 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
29540 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
29560 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
29570 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
29580 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
29590 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
295a0 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
295b0 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
295c0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
295d0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
295e0 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
295f0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
29600 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
29610 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
29620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29630 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
29640 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
29650 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
29660 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
29670 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
29680 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
29690 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
296a0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
296b0 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
296c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
296d0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
296e0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
296f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
29700 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
29710 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
29720 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
29730 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70  number of this p
29740 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  age is larger th
29750 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  an the current s
29760 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ize of.    ** th
29770 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
29780 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  , it may need to
29790 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
297a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
297b0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
297c0 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
297d0 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  to pager_write_p
297e0 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20  agelist() below 
297f0 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  will not.    ** 
29800 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64  actually write d
29810 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20  ata to the file 
29820 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
29830 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73    **.    ** Cons
29840 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
29850 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
29860 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  vents:.    **.  
29870 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
29880 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
29890 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  l page X>.    **
298a0 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67       <modify pag
298b0 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
298c0 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20  SAVEPOINT sp;.  
298d0 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69    **       <shri
298e0 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  nk database file
298f0 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20   to Y pages>.   
29900 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53   **       pagerS
29910 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20  tress(page X).  
29920 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
29930 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a  K TO sp;.    **.
29940 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c      ** If (X>Y),
29950 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72   then when pager
29960 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64  Stress is called
29970 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74   page X will not
29980 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20   be written.    
29990 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
299a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74  tabase file, but
299b0 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64   will be dropped
299c0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e   from the cache.
299d0 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f   Then,.    ** fo
299e0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c  llowing the "ROL
299f0 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61  LBACK TO sp" sta
29a00 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20  tement, reading 
29a10 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64  page X will read
29a20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  .    ** data fro
29a30 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
29a40 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ile. This will b
29a50 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61  e the copy of pa
29a60 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a  ge X as it.    *
29a70 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74  * was when the t
29a80 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
29a90 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61  ed, not as it wa
29aa0 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e  s when "SAVEPOIN
29ab0 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73  T sp".    ** was
29ac0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
29ad0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
29ae0 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74  ution is to writ
29af0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  e the current da
29b00 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e  ta for page X in
29b10 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  to the .    ** s
29b20 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
29b30 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f  now (if it is no
29b40 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29  t already there)
29b50 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  , so that it wil
29b60 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74  l.    ** be rest
29b70 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72  ored to its curr
29b80 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74  ent value when t
29b90 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
29ba0 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  sp" is .    ** e
29bb0 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  xecuted..    */.
29bc0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20      if( NEVER(. 
29bd0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
29be0 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e  E_OK && pPg->pgn
29bf0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
29c00 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
29c10 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20  Page(pPg).    ) 
29c20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
29c30 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
29c40 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
29c50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  /* Write the con
29c60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
29c70 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  e out to the dat
29c80 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
29c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
29cb0 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
29cc0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
29cd0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  C)==0 );.      r
29ce0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
29cf0 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
29d00 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
29d10 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
29d20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
29d30 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
29d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
29d50 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
29d60 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
29d70 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
29d80 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
29d90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
29da0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
29db0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
29dc0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
29dd0 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   rc); .}.../*.**
29de0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
29df0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
29e00 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
29e10 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
29e20 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
29e30 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
29e40 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
29e50 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
29e60 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
29e70 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
29e80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
29e90 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
29ea0 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
29eb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29ec0 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
29ed0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
29ee0 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
29ef0 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
29f00 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
29f10 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
29f20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
29f30 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
29f40 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
29f50 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
29f60 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
29f70 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
29f80 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
29f90 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
29fa0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
29fb0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
29fc0 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
29fd0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
29fe0 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
29ff0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
2a000 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
2a010 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
2a020 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
2a030 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
2a040 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2a050 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
2a060 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
2a070 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
2a080 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
2a090 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
2a0a0 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
2a0b0 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
2a0c0 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
2a0d0 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
2a0e0 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
2a0f0 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
2a100 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
2a110 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
2a120 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
2a130 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
2a140 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
2a150 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
2a160 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
2a170 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  R_* flags..**.**
2a180 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
2a190 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
2a1a0 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
2a1b0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2a1c0 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
2a1d0 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
2a1e0 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
2a1f0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
2a200 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
2a210 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
2a220 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
2a230 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
2a240 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
2a250 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
2a260 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2a270 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
2a280 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
2a290 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
2a2a0 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
2a2b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
2a2c0 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
2a2d0 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
2a2e0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
2a2f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
2a300 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
2a310 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
2a320 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
2a330 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
2a340 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
2a350 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
2a360 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
2a370 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
2a380 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2a390 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
2a3a0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2a3b0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2a3c0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
2a3d0 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
2a3e0 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
2a3f0 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
2a400 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2a410 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2a420 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2a430 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
2a440 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2a450 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
2a460 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
2a470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2a480 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
2a490 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2a4a0 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2a4b0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2a4c0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
2a4d0 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
2a4e0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
2a4f0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
2a500 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
2a510 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
2a520 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
2a530 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
2a540 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
2a550 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
2a560 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
2a570 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
2a580 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
2a590 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
2a5a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
2a5b0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
2a5c0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
2a5d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2a5e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2a5f0 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
2a600 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
2a610 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
2a620 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
2a630 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
2a640 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
2a650 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2a660 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2a670 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
2a680 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
2a690 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
2a6a0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2a6b0 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
2a6c0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
2a6d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
2a6e0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2a6f0 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
2a700 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
2a710 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
2a720 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
2a730 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
2a740 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2a750 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
2a760 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a770 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
2a780 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
2a790 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
2a7a0 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
2a7b0 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
2a7c0 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
2a7d0 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63  rnal */.  int pc
2a7e0 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2a7f0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2a800 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2a810 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2a820 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2a830 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2a840 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2a850 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2a860 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2a870 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2a880 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2a890 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2a8a0 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a8c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2a8d0 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2a8e0 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2a8f0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2a900 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2a910 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2a920 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2a930 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2a940 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2a950 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2a960 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2a970 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
2a980 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
2a990 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
2a9a0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
2a9b0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2a9c0 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
2a9d0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2a9e0 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
2a9f0 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
2aa00 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
2aa10 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
2aa20 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
2aa30 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
2aa40 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
2aa50 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
2aa60 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
2aa70 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
2aa80 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2aa90 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
2aaa0 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
2aab0 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
2aac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
2aad0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
2aae0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2aaf0 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
2ab00 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2ab10 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
2ab20 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
2ab30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
2ab40 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2ab50 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
2ab60 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
2ab70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2ab80 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2ab90 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2aba0 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2abb0 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2abc0 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2abd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2abe0 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2abf0 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2ac00 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2ac10 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  1;.    if( zFile
2ac20 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2ac30 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50  e[0] ){.      zP
2ac40 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2ac50 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69  3DbStrDup(0, zFi
2ac60 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
2ac70 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2ac80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2ac90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50  _NOMEM;.      nP
2aca0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2acb0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2acc0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c  ame);.      zFil
2acd0 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ename = 0;.    }
2ace0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2acf0 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
2ad00 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
2ad10 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
2ad20 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
2ad30 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
2ad40 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
2ad50 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
2ad60 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
2ad70 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
2ad80 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
2ad90 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
2ada0 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
2adb0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2adc0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2add0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  e[0] ){.    cons
2ade0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e  t char *z;.    n
2adf0 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
2ae00 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
2ae10 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2ae20 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
2ae30 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32  w(0, nPathname*2
2ae40 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
2ae50 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
2ae60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ae70 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2ae80 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
2ae90 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
2aea0 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
2aeb0 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
2aec0 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  ) fails */.    r
2aed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
2aee0 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
2aef0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
2af00 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
2af10 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2af20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2af30 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
2af40 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46    z = zUri = &zF
2af50 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53  ilename[sqlite3S
2af60 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
2af70 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65  e)+1];.    while
2af80 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20  ( *z ){.      z 
2af90 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2afa0 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a  30(z)+1;.      z
2afb0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2afc0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a  n30(z)+1;.    }.
2afd0 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29      nUri = (int)
2afe0 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a  (&z[1] - zUri);.
2aff0 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69      assert( nUri
2b000 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  >=0 );.    if( r
2b010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b020 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73  nPathname+8>pVfs
2b030 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a  ->mxPathname ){.
2b040 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2b050 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
2b060 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  en the journal p
2b070 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a  ath required by.
2b080 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
2b090 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e  abase being open
2b0a0 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ed will be more 
2b0b0 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74  than pVfs->mxPat
2b0c0 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62  hname.      ** b
2b0d0 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
2b0e0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64  This means the d
2b0f0 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
2b100 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  e opened,.      
2b110 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  ** as it will no
2b120 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
2b130 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
2b140 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20  l file or even. 
2b150 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f       ** check fo
2b160 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
2b170 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a  before reading..
2b180 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b190 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
2b1a0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
2b1b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b1c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2b1d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2b1e0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2b1f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b200 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
2b210 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
2b220 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2b230 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a  ture, PCache obj
2b240 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68  ect, the.  ** th
2b250 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ree file descrip
2b260 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61  tors, the databa
2b270 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  se file name and
2b280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
2b290 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68  ** file name. Th
2b2a0 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f  e layout in memo
2b2b0 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ry is as follows
2b2c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2b2d0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20  Pager object    
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62  (sizeof(Pager) b
2b300 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50  ytes).  **     P
2b310 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20  Cache object    
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b330 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2b340 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e() bytes).  ** 
2b350 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2b360 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2b370 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46      (pVfs->szOsF
2b380 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ile bytes).  ** 
2b390 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20      Sub-journal 
2b3a0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2b3b0 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2b3c0 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2b3d0 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61       Main journa
2b3e0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2b3f0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2b400 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2b410 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2b420 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
2b430 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2b440 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  +1 bytes).  **  
2b450 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
2b460 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
2b470 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b     (nPathname+8+
2b480 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20  1 bytes).  */.  
2b490 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c  pPtr = (u8 *)sql
2b4a0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
2b4b0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
2b4c0 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20  f(*pPager)) +   
2b4d0 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
2b4e0 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55  cture */.    ROU
2b4f0 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20  ND8(pcacheSize) 
2b500 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
2b510 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Cache object */.
2b520 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d      ROUND8(pVfs-
2b530 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20  >szOsFile) +    
2b540 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
2b550 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
2b560 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
2b570 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2 +          /* 
2b580 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
2b590 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
2b5a0 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2b5b0 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  ri +         /* 
2b5c0 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  zFilename */.   
2b5d0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b   nPathname + 8 +
2b5e0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
2b5f0 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  /* zJournal */.#
2b600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b610 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61  IT_WAL.    + nPa
2b620 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20  thname + 4 + 2  
2b630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61            /* zWa
2b640 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b  l */.#endif.  );
2b650 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2b660 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2b670 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2b680 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
2b690 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
2b6a0 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
2b6b0 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2b6c0 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
2b6d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2b6e0 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
2b700 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
2b710 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
2b720 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
2b730 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
2b740 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
2b750 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
2b760 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2b770 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2b780 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
2b790 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
2b7a0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2b7b0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
2b7c0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
2b7d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
2b7e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2b7f0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2b800 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
2b810 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
2b820 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2b830 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2b840 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
2b850 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2b860 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
2b870 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2b880 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
2b890 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
2b8a0 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
2b8b0 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
2b8c0 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
2b8d0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
2b8e0 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a   nPathname>0 );.
2b8f0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
2b900 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
2b910 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
2b920 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a  me + 1 + nUri);.
2b930 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2b940 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
2b950 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2b960 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72  me);.    if( nUr
2b970 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67  i ) memcpy(&pPag
2b980 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2b990 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2b9a0 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  , nUri);.    mem
2b9b0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2b9c0 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2b9d0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2b9e0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2b9f0 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2ba00 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c  ame], "-journal\
2ba10 30 30 30 22 2c 20 38 2b 31 29 3b 0a 20 20 20 20  000", 8+1);.    
2ba20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2ba30 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2ba40 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  name, pPager->zJ
2ba50 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66  ournal);.#ifndef
2ba60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2ba70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61  .    pPager->zWa
2ba80 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
2ba90 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
2baa0 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  8+1];.    memcpy
2bab0 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a  (pPager->zWal, z
2bac0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2bad0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2bae0 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e  (&pPager->zWal[n
2baf0 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c  Pathname], "-wal
2bb00 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20  \000", 4+1);.   
2bb10 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2bb20 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2bb30 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2bb40 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Wal);.#endif.   
2bb50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2bb60 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2bb70 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
2bb80 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
2bb90 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
2bba0 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
2bbb0 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
2bbc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
2bbd0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2bbe0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
2bbf0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc10 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
2bc20 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
2bc30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2bc40 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2bc50 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2bc60 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
2bc70 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
2bc80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
2bc90 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64  emDb );.    read
2bca0 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2bcb0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2bcc0 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
2bcd0 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2bce0 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2bcf0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2bd00 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2bd10 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2bd20 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2bd30 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2bd40 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2bd50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2bd60 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2bd70 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2bd80 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2bd90 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2bda0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bdb0 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2bdc0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2bdd0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2bde0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2bdf0 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2be00 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2be10 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2be20 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2be30 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2be40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
2be50 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
2be60 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2be70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
2be80 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2be90 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2bea0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2beb0 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2bec0 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
2bed0 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
2bee0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2bef0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2bf00 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2bf10 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2bf20 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2bf30 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2bf40 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2bf50 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2bf60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bf70 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2bf80 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2bf90 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2bfa0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
2bfb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2bfc0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2bfd0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
2bfe0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2bff0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2c000 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2c010 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  fd);.        int
2c020 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
2c030 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2c040 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2c050 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2c060 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2c070 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2c080 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2c090 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2c0a0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2c0b0 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2c0c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
2c0d0 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
2c0e0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2c0f0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
2c100 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
2c110 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2c120 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2c130 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2c140 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2c150 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2c160 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c170 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2c180 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2c190 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
2c1a0 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
2c1b0 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
2c1c0 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
2c1d0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
2c1e0 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
2c1f0 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
2c200 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
2c210 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
2c220 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
2c230 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
2c240 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
2c250 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
2c260 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2c270 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
2c280 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2c290 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
2c2a0 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
2c2b0 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
2c2c0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
2c2d0 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2c2e0 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
2c2f0 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
2c300 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
2c310 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
2c320 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
2c330 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2c340 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2c350 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
2c360 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45  Pager->eLock = E
2c370 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
2c380 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
2c390 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
2c3a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2c3b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
2c3c0 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
2c3d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2c3e0 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
2c3f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
2c400 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
2c410 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
2c420 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
2c430 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2c440 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2c450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2c460 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
2c470 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
2c480 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2c490 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
2c4a0 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
2c4b0 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
2c4c0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
2c4d0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
2c4e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2c4f0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
2c500 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
2c510 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
2c520 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2c530 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2c540 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2c550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c560 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2c570 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
2c580 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
2c590 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2c5a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2c5b0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
2c5c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c5d0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2c5e0 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2c5f0 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
2c600 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
2c610 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2c620 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
2c630 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2c640 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2c650 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2c670 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2c680 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2c690 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2c6a0 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
2c6b0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2c6c0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2c6d0 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2c6e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2c6f0 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2c700 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2c710 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2c720 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2c730 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2c740 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2c750 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  al;.  /* pPager-
2c760 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2c770 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2c780 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2c790 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2c7a0 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2c7b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2c7c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c7d0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2c7e0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c7f0 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2c800 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2c810 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2c820 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2c830 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2c840 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2c850 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
2c860 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2c870 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
2c880 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2c890 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
2c8a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70  );.#endif.  /* p
2c8b0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2c8c0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2c8d0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2c8e0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2c8f0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2c900 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2c910 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2c920 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2c930 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2c940 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2c950 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2c960 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2c970 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2c980 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2c990 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2c9a0 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2c9b0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2c9c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2c9d0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2c9e0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2c9f0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2ca00 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2ca10 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2ca20 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2ca30 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2ca40 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2ca50 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2ca60 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2ca70 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
2ca80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
2ca90 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
2caa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2cab0 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  >syncFlags==0 );
2cac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2cad0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2cae0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
2caf0 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  rt( pPager->ckpt
2cb00 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2cb10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2cb20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
2cb30 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
2cb40 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2cb50 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2cb60 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
2cb70 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2cb80 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57  _SYNC_NORMAL | W
2cb90 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
2cba0 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72  IONS;.    pPager
2cbb0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
2cbc0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2cbd0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  RMAL;.  }.  /* p
2cbe0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
2cbf0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2cc00 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
2cc10 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2cc20 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
2cc30 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
2cc40 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
2cc50 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
2cc60 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
2cc70 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
2cc80 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
2cc90 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
2cca0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2ccb0 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
2ccc0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2ccd0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
2cce0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2ccf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2cd00 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2cd10 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
2cd20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
2cd30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2cd40 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2cd50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2cd60 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
2cd70 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
2cd80 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
2cd90 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
2cda0 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
2cdb0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
2cdc0 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
2cdd0 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2cde0 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2cdf0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2ce00 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70  ash)); */..  *pp
2ce10 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
2ce20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ce30 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54  OK;.}..../*.** T
2ce40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ce50 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
2ce60 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
2ce70 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
2ce80 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
2ce90 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
2cea0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
2ceb0 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
2cec0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
2ced0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2cee0 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
2cef0 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
2cf00 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
2cf10 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2cf20 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
2cf30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2cf40 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
2cf50 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
2cf60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
2cf70 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
2cf80 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
2cf90 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2cfa0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
2cfb0 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
2cfc0 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
2cfd0 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
2cfe0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2cff0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d000 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2d010 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d020 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
2d030 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
2d040 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
2d050 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
2d060 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2d070 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2d080 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
2d090 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
2d0a0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
2d0b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2d0c0 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
2d0d0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
2d0e0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
2d0f0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
2d100 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
2d110 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
2d120 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
2d130 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
2d140 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
2d150 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
2d160 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
2d170 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
2d180 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
2d190 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2d1a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2d1b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
2d1c0 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
2d1d0 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
2d1e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
2d1f0 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
2d200 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
2d210 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
2d220 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
2d230 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
2d240 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
2d250 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d260 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2d270 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
2d280 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
2d290 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
2d2a0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
2d2b0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
2d2c0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
2d2d0 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
2d2e0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
2d2f0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2d300 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
2d310 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
2d320 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
2d330 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2d340 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
2d350 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
2d360 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
2d370 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2d380 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
2d390 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2d3a0 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
2d3b0 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
2d3c0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2d3d0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2d3e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2d3f0 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
2d400 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
2d410 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
2d420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2d430 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
2d440 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
2d450 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
2d460 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
2d470 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
2d480 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
2d490 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
2d4a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
2d4b0 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
2d4c0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2d4d0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2d4e0 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
2d4f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2d500 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2d510 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
2d520 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
2d530 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d540 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
2d550 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
2d560 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
2d570 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2d580 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
2d590 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2d5a0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
2d5b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2d5c0 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
2d5d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2d5e0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
2d5f0 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
2d600 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
2d610 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2d620 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2d630 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
2d640 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
2d650 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
2d660 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
2d670 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
2d680 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
2d690 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2d6a0 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
2d6b0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
2d6c0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
2d6d0 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
2d6e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d6f0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
2d700 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
2d710 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2d720 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
2d730 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2d740 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
2d750 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
2d760 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
2d770 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
2d780 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
2d790 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
2d7a0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2d7b0 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
2d7c0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
2d7d0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
2d7e0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
2d7f0 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
2d800 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2d810 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
2d820 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
2d830 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
2d840 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
2d850 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2d860 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
2d870 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
2d880 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
2d890 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
2d8a0 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
2d8b0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
2d8c0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
2d8d0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
2d8e0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
2d8f0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2d900 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
2d910 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
2d920 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
2d930 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
2d940 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
2d950 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d960 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2d970 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
2d980 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
2d990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d9a0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
2d9b0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
2d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2d9e0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
2d9f0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ile */..      /*
2da00 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20   Check the size 
2da10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2da20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73  file. If it cons
2da30 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c  ists of 0 pages,
2da40 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64  .      ** then d
2da50 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2da60 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20  l file. See the 
2da70 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61  header comment a
2da80 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20  bove for .      
2da90 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67  ** the reasoning
2daa0 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74   here.  Delete t
2dab0 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  he obsolete jour
2dac0 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20  nal file under. 
2dad0 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56       ** a RESERV
2dae0 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64  ED lock to avoid
2daf0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
2db00 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69   and to avoid vi
2db10 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  olating.      **
2db20 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20   [H33020]..     
2db30 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
2db40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2db50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
2db60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2db70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2db80 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
2db90 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2dba0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
2dbb0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2dbc0 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44    if( pagerLockD
2dbd0 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
2dbe0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
2dbf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2dc00 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
2dc10 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
2dc20 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
2dc30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2dc40 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2dc50 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c  eMode ) pagerUnl
2dc60 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
2dc70 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2dc80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dc90 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
2dca0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2dcb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dcc0 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
2dcd0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2dce0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
2dcf0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
2dd00 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
2dd10 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
2dd20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2dd30 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
2dd40 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
2dd50 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
2dd60 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
2dd70 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
2dd80 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
2dd90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
2dda0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2ddb0 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
2ddc0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
2ddd0 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
2dde0 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
2ddf0 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
2de00 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
2de10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2de20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2de30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2de40 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
2de50 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
2de60 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2de70 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
2de80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2de90 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2dea0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
2deb0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
2dec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ded0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2dee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2def0 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
2df00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2df10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2df20 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
2df30 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
2df40 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
2df50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2df60 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
2df70 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
2df80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2df90 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
2dfa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2dfb0 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
2dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2dfd0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2dfe0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2dff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e000 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
2e010 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
2e020 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e030 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
2e040 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
2e050 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
2e060 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
2e070 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
2e080 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
2e090 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
2e0a0 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
2e0b0 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
2e0c0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
2e0d0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
2e0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e0f0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
2e100 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
2e110 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
2e120 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
2e130 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
2e140 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
2e150 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
2e160 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
2e170 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
2e180 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
2e190 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
2e1a0 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
2e1b0 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
2e1c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
2e1d0 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
2e1e0 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
2e1f0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
2e200 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
2e210 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
2e220 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
2e230 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
2e240 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
2e250 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
2e260 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
2e270 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
2e280 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
2e290 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
2e2a0 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
2e2b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2e2c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2e2d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2e2e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2e2f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e300 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2e310 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2e320 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
2e330 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
2e340 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
2e350 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
2e360 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2e370 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
2e380 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
2e390 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
2e3a0 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
2e3b0 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
2e3c0 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
2e3d0 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
2e3e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2e3f0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2e400 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
2e410 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
2e420 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
2e430 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
2e440 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2e450 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
2e460 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
2e470 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
2e480 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
2e490 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
2e4a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
2e4b0 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
2e4c0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
2e4d0 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
2e4e0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
2e4f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2e500 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
2e510 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
2e520 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
2e530 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
2e540 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
2e550 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2e560 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
2e570 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
2e580 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
2e590 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
2e5a0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
2e5b0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
2e5c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
2e5d0 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
2e5e0 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
2e5f0 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
2e600 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
2e610 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e620 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
2e630 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
2e640 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
2e650 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
2e660 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
2e670 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
2e680 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
2e690 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
2e6a0 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
2e6b0 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
2e6c0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2e6d0 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
2e6e0 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
2e6f0 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
2e700 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
2e710 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
2e720 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
2e730 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
2e740 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
2e750 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2e760 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
2e770 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
2e780 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
2e790 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
2e7a0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
2e7b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2e7c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2e7d0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2e7e0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
2e7f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
2e800 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
2e810 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
2e820 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
2e830 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
2e840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2e850 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
2e860 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2e870 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e880 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
2e890 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2e8a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2e8d0 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
2e8e0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2e8f0 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
2e900 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
2e910 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
2e920 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
2e930 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
2e940 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
2e950 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
2e960 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
2e970 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
2e980 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
2e990 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
2e9a0 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
2e9b0 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
2e9c0 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ess mode..  */. 
2e9d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e9e0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2e9f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
2ea00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2ea10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
2ea20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
2ea30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ea40 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2ea50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
2ea60 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
2ea70 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ER );.  if( NEVE
2ea80 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  R(MEMDB && pPage
2ea90 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72  r->errCode) ){ r
2eaa0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2eab0 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20  rCode; }..  if( 
2eac0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2ead0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
2eae0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2eaf0 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
2eb00 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
2eb10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2eb20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2eb30 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
2eb40 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
2eb50 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20  t( !MEMDB );..  
2eb60 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
2eb70 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
2eb80 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2eb90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2eba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2ebb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2ebc0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
2ebd0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2ebe0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
2ebf0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2ec00 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
2ec10 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
2ec20 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
2ec30 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
2ec40 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
2ec50 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2ec60 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
2ec70 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
2ec80 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
2ec90 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
2eca0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2ecb0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
2ecc0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
2ecd0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
2ece0 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
2ecf0 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
2ed00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ed10 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2ed20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
2ed30 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
2ed40 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
2ed50 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
2ed60 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2ed70 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
2ed80 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
2ed90 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
2eda0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
2edb0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
2edc0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
2edd0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2ede0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2edf0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
2ee00 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2ee10 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
2ee20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2ee30 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
2ee40 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
2ee50 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
2ee60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2ee70 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
2ee80 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
2ee90 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
2eea0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
2eeb0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
2eec0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
2eed0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
2eee0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
2eef0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
2ef00 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
2ef10 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
2ef20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
2ef30 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
2ef40 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
2ef50 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
2ef60 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
2ef70 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
2ef80 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
2ef90 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
2efa0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
2efb0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
2efc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2efd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2efe0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
2eff0 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
2f000 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
2f010 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
2f020 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
2f030 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
2f040 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
2f050 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2f060 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2f070 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
2f080 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
2f090 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2f0a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f0b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2f0c0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2f0d0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
2f0e0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2f0f0 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
2f100 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
2f110 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
2f120 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
2f130 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2f140 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
2f150 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
2f160 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
2f170 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
2f180 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
2f190 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2f1a0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
2f1b0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
2f1c0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
2f1d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
2f1e0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
2f1f0 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
2f200 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
2f210 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
2f220 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2f230 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
2f240 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
2f250 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
2f260 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
2f270 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
2f280 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
2f290 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2f2a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2f2b0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2f2c0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
2f2d0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
2f2e0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
2f2f0 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
2f300 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
2f310 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
2f320 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
2f330 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
2f340 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
2f350 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
2f360 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
2f370 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
2f380 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
2f390 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
2f3a0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
2f3b0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2f3c0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
2f3d0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
2f3e0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
2f3f0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
2f400 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f410 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f420 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2f430 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2f440 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
2f450 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
2f460 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f470 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
2f480 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
2f490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2f4a0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
2f4b0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
2f4c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2f4d0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2f4e0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
2f4f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f500 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
2f510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2f520 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
2f530 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
2f540 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2f550 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2f560 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2f570 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f580 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2f590 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2f5a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2f5b0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2f5c0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2f5d0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
2f5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2f5f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2f600 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2f610 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
2f620 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f630 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
2f640 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f650 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
2f660 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f670 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2f680 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f690 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2f6a0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2f6b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f6c0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2f6d0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
2f6e0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2f6f0 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
2f700 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
2f710 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
2f720 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
2f730 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
2f740 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
2f750 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
2f760 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
2f770 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
2f780 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
2f790 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
2f7a0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
2f7b0 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
2f7c0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
2f7d0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
2f7e0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
2f7f0 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
2f800 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
2f810 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
2f820 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
2f830 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
2f840 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
2f850 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
2f860 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
2f870 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2f880 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
2f890 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f8a0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2f8b0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2f8c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2f8d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2f8e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
2f8f0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
2f900 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
2f910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f920 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2f930 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2f940 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2f950 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
2f960 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
2f970 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
2f980 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
2f990 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2f9a0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
2f9b0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2f9c0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2f9d0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2f9e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f9f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2fa00 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2fa10 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
2fa20 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2fa30 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
2fa40 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
2fa50 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
2fa60 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
2fa70 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
2fa80 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2fa90 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
2faa0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
2fab0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2fac0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
2fad0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
2fae0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2faf0 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
2fb00 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
2fb10 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
2fb20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
2fb30 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
2fb40 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
2fb50 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
2fb60 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
2fb70 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
2fb80 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
2fb90 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
2fba0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2fbb0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
2fbc0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
2fbd0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
2fbe0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
2fbf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
2fc00 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
2fc10 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
2fc20 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
2fc30 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
2fc40 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
2fc50 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
2fc60 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
2fc70 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
2fc80 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
2fc90 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
2fca0 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
2fcb0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2fcc0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
2fcd0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
2fce0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
2fcf0 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
2fd00 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
2fd10 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
2fd20 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2fd30 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
2fd40 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
2fd50 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2fd60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
2fd70 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
2fd80 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2fd90 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
2fda0 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
2fdb0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
2fdc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fdd0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2fde0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
2fdf0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2fe00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2fe10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2fe20 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2fe30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2fe40 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
2fe50 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
2fe60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
2fe70 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2fe80 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2fe90 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
2fea0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
2feb0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
2fec0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20 20 20  r->tempFile .   
2fed0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 70 42    && (pPager->pB
2fee0 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
2fef0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
2ff00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2ff10 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  >0) .    ){.    
2ff20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
2ff30 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
2ff40 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
2ff50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ff60 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
2ff70 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
2ff80 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
2ff90 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
2ffa0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
2ffb0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
2ffc0 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
2ffd0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
2ffe0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
2fff0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
30000 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
30010 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
30020 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
30030 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
30040 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
30050 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
30060 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
30070 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
30080 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
30090 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
300a0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
300b0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
300c0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
300d0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
300e0 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
300f0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
30100 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
30110 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
30120 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
30130 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
30140 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
30150 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
30160 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
30170 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
30180 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
30190 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
301a0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
301b0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
301c0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
301d0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
301e0 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
301f0 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
30200 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
30210 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
30220 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
30230 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
30240 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
30250 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
30260 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
30270 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
30280 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
30290 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
302a0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
302b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
302c0 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
302d0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
302e0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
302f0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
30300 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
30310 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
30320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30330 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
30340 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
30350 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
30360 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
30370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30380 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30390 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
303a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
303b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
303c0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
303d0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
303e0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
303f0 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
30400 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
30410 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
30420 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
30430 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
30440 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
30450 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
30460 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
30470 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
30480 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
30490 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
304a0 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
304b0 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
304c0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
304d0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
304e0 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
304f0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
30500 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
30510 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
30520 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30530 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
30540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
30550 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
30560 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
30570 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
30580 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
30590 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
305a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
305b0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
305c0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
305d0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
305e0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
305f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
30600 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
30610 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
30620 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
30630 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
30640 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
30650 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
30660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30670 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
30680 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
30690 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
306a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
306b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
306c0 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
306d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
306e0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
306f0 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
30700 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
30710 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
30720 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
30730 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
30740 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
30750 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
30760 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
30770 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
30780 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
30790 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
307a0 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
307b0 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
307c0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
307d0 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
307e0 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
307f0 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
30800 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
30810 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
30820 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
30830 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
30840 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
30850 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30860 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
30870 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
30880 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
30890 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
308a0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
308b0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
308c0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
308d0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
308e0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
308f0 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
30900 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
30910 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
30920 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
30930 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
30940 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
30950 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
30960 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
30970 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
30980 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
30990 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
309a0 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
309b0 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
309c0 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
309d0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
309e0 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
309f0 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
30a00 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
30a10 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
30a20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
30a30 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
30a40 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
30a50 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
30a60 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
30a70 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
30a80 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
30a90 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
30aa0 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
30ab0 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
30ac0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
30ad0 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
30ae0 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
30af0 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
30b00 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
30b10 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
30b20 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
30b30 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
30b40 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
30b50 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
30b60 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
30b70 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
30b80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30b90 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
30ba0 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
30bb0 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
30bc0 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
30bd0 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
30be0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
30bf0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
30c00 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
30c10 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
30c20 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
30c30 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
30c40 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
30c50 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
30c60 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
30c70 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
30c80 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
30c90 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
30ca0 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
30cb0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
30cc0 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
30cd0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
30ce0 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
30cf0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
30d00 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
30d10 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
30d20 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
30d30 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
30d40 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
30d50 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
30d60 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
30d70 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
30d80 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
30d90 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
30da0 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
30db0 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
30dc0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
30dd0 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
30de0 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
30df0 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
30e00 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
30e10 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
30e20 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
30e30 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
30e40 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
30e50 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
30e60 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
30e70 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
30e80 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
30e90 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
30ea0 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
30eb0 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
30ec0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
30ed0 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
30ee0 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
30ef0 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
30f00 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
30f10 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
30f20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
30f30 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
30f40 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
30f50 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
30f60 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
30f70 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
30f80 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
30f90 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
30fa0 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
30fb0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
30fc0 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
30fd0 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
30fe0 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
30ff0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
31000 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
31010 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31020 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
31030 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
31040 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
31050 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
31060 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
31070 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
31080 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
31090 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
310a0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
310b0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
310c0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
310d0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
310e0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
310f0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
31100 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
31110 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
31120 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
31130 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
31140 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
31150 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
31160 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
31170 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
31180 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
31190 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
311a0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
311b0 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
311c0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
311d0 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
311e0 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
311f0 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
31200 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
31210 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
31220 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
31230 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
31240 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
31250 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
31260 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
31270 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
31280 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
31290 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
312a0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
312b0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
312c0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
312d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
312e0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
312f0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
31300 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
31310 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
31320 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
31330 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
31340 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
31350 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
31360 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31370 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
31380 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
31390 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
313a0 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
313b0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
313c0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
313d0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
313e0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
313f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
31400 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
31410 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
31420 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
31430 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  er) );..  if( pg
31440 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
31450 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31460 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
31470 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
31480 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
31490 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
314a0 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
314b0 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
314c0 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
314d0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
314e0 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
314f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
31500 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
31510 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
31520 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
31530 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
31540 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
31550 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
31560 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
31570 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
31580 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31590 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
315a0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
315b0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
315c0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
315d0 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
315e0 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
315f0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
31600 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
31610 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
31620 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
31630 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
31640 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
31650 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
31660 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
31670 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
31680 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
31690 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
316a0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
316b0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
316c0 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
316d0 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
316e0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
316f0 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
31700 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
31710 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
31720 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
31730 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
31740 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
31750 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
31760 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
31770 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
31780 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
31790 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
317a0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
317b0 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
317c0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
317d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
317e0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
317f0 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74  _HIT]++;.    ret
31800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
31810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
31820 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
31830 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
31840 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
31850 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
31860 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
31870 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50  zed.  */..    pP
31880 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20  g = *ppPage;.   
31890 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
318a0 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
318b0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
318c0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
318d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
318e0 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
318f0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
31900 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
31910 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
31920 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
31930 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
31940 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
31950 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
31960 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
31970 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
31980 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
31990 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
319a0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
319b0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
319c0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
319d0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
319e0 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
319f0 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
31a00 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
31a10 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
31a20 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
31a30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31a40 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
31a50 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
31a60 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
31a70 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
31a80 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
31a90 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
31aa0 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
31ab0 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
31ac0 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
31ad0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
31ae0 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
31af0 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
31b00 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
31b10 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
31b20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
31b30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
31b40 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
31b50 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
31b60 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
31b70 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
31b80 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
31b90 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
31ba0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
31bb0 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
31bc0 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
31bd0 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
31be0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
31bf0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
31c00 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
31c10 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
31c20 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
31c30 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
31c40 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
31c50 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
31c60 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
31c70 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
31c80 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
31c90 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
31ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
31cb0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
31cc0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
31cd0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
31ce0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
31cf0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
31d00 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
31d10 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
31d20 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
31d30 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
31d40 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
31d50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
31d60 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
31d70 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
31d80 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
31d90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
31da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
31db0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
31dc0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
31dd0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
31de0 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20  T_MISS]++;.     
31df0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
31e00 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
31e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31e20 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
31e30 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
31e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31e50 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
31e60 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d  gehash(pPg);.  }
31e70 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
31e80 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
31e90 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
31ea0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
31eb0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
31ec0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
31ed0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
31ee0 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
31ef0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
31f00 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ..  *ppPage = 0;
31f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31f20 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
31f30 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
31f40 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
31f50 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
31f60 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
31f70 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
31f80 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
31f90 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
31fa0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
31fb0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
31fc0 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65  cache. .**.** Se
31fd0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
31fe0 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
31ff0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
32000 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
32010 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
32020 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
32030 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
32040 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
32050 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
32060 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
32070 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
32080 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
32090 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
320a0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
320b0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
320c0 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
320d0 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
320e0 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
320f0 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
32100 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
32110 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
32120 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
32130 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73   *pPg = 0;.  ass
32140 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
32150 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
32160 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
32170 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
32180 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
32190 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
321a0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
321b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
321c0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
321d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
321e0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
321f0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
32200 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
32210 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
32220 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
32230 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rence..**.** If 
32240 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
32250 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
32260 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
32270 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
32280 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
32290 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
322a0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
322b0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
322c0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
322d0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
322e0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
322f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
32300 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
32310 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
32320 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
32330 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
32340 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
32350 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
32360 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
32370 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
32380 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  g);.    pagerUnl
32390 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
323a0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
323b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
323c0 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
323d0 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
323e0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
323f0 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
32400 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
32410 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
32420 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32430 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
32440 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
32450 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
32460 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
32470 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
32480 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
32490 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
324a0 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
324b0 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
324c0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
324d0 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
324e0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
324f0 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
32500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32510 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
32520 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32530 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
32540 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
32550 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
32560 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
32570 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
32580 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
32590 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
325a0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
325b0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
325c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
325d0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
325e0 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
325f0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
32600 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
32610 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
32620 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
32630 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
32640 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
32650 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
32660 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
32670 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
32680 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
32690 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
326a0 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
326b0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
326c0 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
326d0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
326e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
326f0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
32700 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
32710 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
32720 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
32730 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
32740 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
32750 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
32760 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
32770 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
32780 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
32790 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
327a0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
327b0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
327c0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
327d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
327e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
327f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32800 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
32810 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
32820 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
32830 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
32840 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
32850 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
32860 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
32870 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32880 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
32890 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
328a0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
328b0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
328c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
328d0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
328e0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
328f0 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
32900 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
32910 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
32920 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
32930 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
32940 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
32950 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
32960 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
32970 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
32980 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
32990 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
329a0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
329b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
329c0 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
329d0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
329e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
329f0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
32a00 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
32a10 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
32a20 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
32a30 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
32a40 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
32a50 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
32a60 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
32a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32a80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a  NOMEM;.    }.  .
32a90 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
32aa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
32ab0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
32ac0 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69  y open. */.    i
32ad0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
32ae0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
32af0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
32b00 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
32b10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
32b20 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  RY ){.        sq
32b30 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
32b40 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32b50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32b60 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
32b70 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
32b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
32b90 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
32ba0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
32bb0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
32bc0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
32bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
32be0 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70  TE|.          (p
32bf0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32c00 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ? .            (
32c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
32c20 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
32c30 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
32c40 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  AL):.           
32c50 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
32c60 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
32c70 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65        );.  #ifde
32c80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
32c90 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
32ca0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32cb0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
32cc0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
32cd0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
32ce0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
32cf0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
32d00 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
32d10 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a       );.  #else.
32d20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32d30 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
32d40 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32d50 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
32d60 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e  flags, 0);.  #en
32d70 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
32d80 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
32d90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
32da0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32db0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
32dc0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
32dd0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
32de0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
32df0 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
32e00 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
32e10 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
32e20 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
32e30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
32e50 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
32e60 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
32e70 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
32e80 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
32e90 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
32ea0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32eb0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
32ec0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
32ed0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
32ee0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
32ef0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
32f00 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
32f10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
32f20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
32f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
32f40 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
32f50 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
32f60 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
32f70 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
32f80 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
32f90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32fa0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32fb0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
32fc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
32fd0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
32fe0 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
32ff0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
33000 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
33010 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33020 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
33030 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
33040 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
33050 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
33060 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
33070 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
33080 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
33090 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
330a0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
330b0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
330c0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
330d0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
330e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
330f0 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
33100 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
33110 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
33120 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
33130 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
33140 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
33150 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
33160 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
33170 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
33180 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
33190 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
331a0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
331b0 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
331c0 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
331d0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
331e0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
331f0 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
33200 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
33210 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
33220 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
33230 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
33240 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
33250 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
33260 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
33270 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
33280 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
33290 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
332a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
332b0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
332c0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
332d0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
332e0 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
332f0 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
33300 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
33310 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
33320 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
33330 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
33340 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
33350 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
33360 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
33370 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
33380 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
33390 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
333a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
333b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
333c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
333d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
333e0 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
333f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33400 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
33410 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
33420 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
33430 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
33440 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
33450 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
33460 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
33470 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33480 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
33490 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
334a0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
334b0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
334c0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
334d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
334e0 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
334f0 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
33500 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
33510 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
33520 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
33530 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
33540 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
33550 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
33560 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
33570 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
33580 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
33590 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
335a0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
335b0 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
335c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
335d0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
335e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
335f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
33600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
33620 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
33630 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45       sqlite3WalE
33640 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
33650 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
33660 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
33670 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
33680 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
33690 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
336a0 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
336b0 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
336c0 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
336d0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
336e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
336f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
33700 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
33710 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
33720 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
33730 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
33740 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
33750 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
33760 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
33770 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
33780 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20   will call it.. 
33790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
337a0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
337b0 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
337c0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
337d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
337e0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
337f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
33800 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33810 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
33820 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
33830 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
33840 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
33850 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
33860 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
33870 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
33880 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
33890 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
338a0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
338b0 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
338c0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
338d0 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
338e0 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
338f0 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
33900 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
33910 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
33920 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
33930 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
33940 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
33950 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
33960 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
33970 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
33980 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
33990 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
339a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
339b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
339c0 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52  Change to WRITER
339d0 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20  _LOCKED state.. 
339e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
339f0 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50   WAL mode sets P
33a00 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50  ager.eState to P
33a10 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
33a20 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20  ED or CACHEMOD. 
33a30 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20       ** when it 
33a40 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  has an open tran
33a50 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
33a60 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46  er to DBMOD or F
33a70 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a  INISHED..      *
33a80 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
33a90 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65  e in those state
33aa0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  s the code to ro
33ab0 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
33ac0 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
33ad0 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70  sactions may cop
33ae0 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  y data from the 
33af0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f  sub-journal into
33b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
33b10 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
33b20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65  well as into the
33b30 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
33b40 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
33b50 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20  rrect in .      
33b60 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20  ** WAL mode..   
33b70 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
33b80 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
33b90 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
33ba0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
33bb0 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
33bc0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
33bd0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
33be0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
33bf0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
33c00 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
33c10 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
33c20 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
33c30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
33c40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
33c50 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
33c60 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
33c70 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
33c80 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
33c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
33ca0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
33cb0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
33cc0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
33cd0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
33ce0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
33cf0 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
33d00 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
33d10 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
33d20 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
33d30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33d40 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
33d50 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
33d60 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
33d70 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
33d80 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
33d90 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
33da0 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
33db0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
33dc0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
33dd0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
33de0 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
33df0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
33e00 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
33e10 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
33e20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
33e30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
33e40 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
33e50 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
33e60 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
33e70 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
33e80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
33e90 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
33ea0 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
33eb0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
33ec0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
33ed0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
33ee0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33ef0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
33f00 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
33f10 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
33f20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33f30 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
33f40 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
33f50 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
33f60 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
33f70 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
33f80 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
33f90 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
33fa0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
33fb0 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
33fc0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33fd0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
33fe0 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
33ff0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34000 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
34010 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
34020 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34030 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
34040 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
34050 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
34060 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
34070 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
34080 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76  or has been prev
34090 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c  iously detected,
340a0 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65   report the same
340b0 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69   error.  ** agai
340c0 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  n. This should n
340d0 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74  ot happen, but t
340e0 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65  he check provide
340f0 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  s robustness. */
34100 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
34110 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
34120 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
34130 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
34140 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
34150 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
34160 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
34170 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
34180 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
34190 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
341a0 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
341b0 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
341c0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
341d0 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
341e0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
341f0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
34200 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
34210 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
34220 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
34230 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
34240 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
34250 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
34260 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
34270 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
34280 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
34290 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
342a0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
342b0 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
342c0 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
342d0 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
342e0 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
342f0 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
34300 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
34310 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
34320 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
34330 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
34340 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
34350 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
34360 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
34370 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
34380 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
34390 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
343a0 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
343b0 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
343c0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
343d0 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
343e0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
343f0 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
34400 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
34410 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
34420 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
34430 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
34440 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
34450 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
34460 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
34470 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
34480 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
34490 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
344a0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
344b0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
344c0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
344d0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
344e0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
344f0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
34500 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
34510 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
34520 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
34530 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
34540 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
34550 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
34560 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
34570 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
34580 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
34590 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
345a0 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
345b0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
345c0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c  pPager) );.  }el
345d0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68  se{.  .    /* Th
345e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
345f0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
34600 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
34610 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
34620 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
34630 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
34640 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
34650 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
34660 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
34670 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34680 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
34690 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
346a0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
346b0 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
346c0 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65  al(pPg) && !page
346d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
346e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
346f0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
34700 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ger)==0 );.     
34710 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
34720 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
34730 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  ze && isOpen(pPa
34740 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
34750 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
34760 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
34770 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36  ata2;.        i6
34780 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
34790 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
347a0 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
347b0 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
347c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
347d0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
347e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
347f0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
34800 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
34810 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
34820 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
34830 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
34840 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
34850 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
34860 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
34870 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20  Pager) );..     
34880 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34890 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
348a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
348b0 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  f );.        COD
348c0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
348d0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
348e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
348f0 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
34900 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
34910 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
34920 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
34930 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
34940 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
34950 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
34960 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  urs while journa
34970 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
34980 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
34990 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
349a0 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
349b0 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
349c0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
349d0 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
349e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
349f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
34a00 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
34a10 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
34a20 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
34a30 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
34a40 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
34a50 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
34a60 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
34a70 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
34a80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
34a90 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
34aa0 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
34ab0 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
34ac0 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
34ad0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67    */.        pPg
34ae0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
34af0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20  _NEED_SYNC;..   
34b00 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
34b10 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
34b20 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67  d, iOff, pPg->pg
34b30 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
34b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34b60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34b70 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
34b80 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
34b90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
34ba0 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  Off+4);.        
34bb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34bc0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
34bd0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
34be0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
34bf0 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
34c00 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
34c10 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sum);.        if
34c20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34c30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
34c40 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
34c50 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
34c60 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
34c70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
34c80 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
34c90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
34ca0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34cb0 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
34cc0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
34cd0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
34ce0 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
34cf0 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c  RTRACE(("JOURNAL
34d00 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
34d10 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
34d20 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
34d30 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
34d40 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
34d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
34d60 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
34d70 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
34d80 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
34d90 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20  (pPg)));..      
34da0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
34db0 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
34dc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
34dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
34de0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
34df0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
34e00 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
34e10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34e20 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
34e30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
34e40 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
34e50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
34e60 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34e70 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
34e80 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
34e90 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
34ea0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34eb0 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
34ec0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
34ed0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
34ee0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34f00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
34f10 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34f20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
34f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
34f40 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
34f50 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
34f60 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
34f70 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
34f80 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
34f90 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
34fa0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
34fb0 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
34fc0 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
34fd0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
34fe0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
34ff0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
35000 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
35010 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
35020 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
35030 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
35040 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
35050 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
35060 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
35070 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
35080 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
35090 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
350a0 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
350b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
350c0 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
350d0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
350e0 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
350f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
35100 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
35110 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
35120 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
35130 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
35140 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
35150 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
35160 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
35170 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
35180 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
35190 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
351a0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
351b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
351c0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
351d0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
351e0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
351f0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
35200 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
35210 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
35220 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
35230 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
35240 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
35250 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
35260 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
35270 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
35280 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
35290 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
352a0 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
352b0 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
352c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
352d0 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
352e0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
352f0 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
35300 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
35310 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
35320 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
35330 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
35340 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
35350 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
35360 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
35370 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
35380 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
35390 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
353a0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
353b0 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
353c0 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
353d0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
353e0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
353f0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
35400 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
35410 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
35420 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
35430 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
35440 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
35450 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
35460 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
35470 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
35480 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
35490 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
354a0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
354b0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
354c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
354d0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
354e0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
354f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
35500 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
35510 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
35520 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
35530 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
35540 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
35550 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
35560 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
35570 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
35580 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
35590 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
355a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
355b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
355c0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
355d0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
355e0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
355f0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  r) );..  if( nPa
35600 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
35610 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
35620 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
35630 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
35640 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
35650 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
35660 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
35670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
35680 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
35690 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
356a0 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
356b0 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20  int nPage = 0;  
356c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
356d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
356e0 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
356f0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
35700 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
35710 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
35720 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
35730 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
35740 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
35750 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
35760 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
35770 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  C */..    /* Set
35780 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70   the doNotSyncSp
35790 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ill flag to 1. T
357a0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
357b0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
357c0 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20     ** a journal 
357d0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
357e0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
357f0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
35800 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   by.    ** this 
35810 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
35820 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
35830 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
35840 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
35850 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  SyncSpill==0 );.
35860 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
35870 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20  tSyncSpill++;.. 
35880 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
35890 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
358a0 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
358b0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
358c0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
358d0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
358e0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
358f0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
35900 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
35910 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
35920 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
35930 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
35940 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
35950 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
35960 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
35970 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
35980 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
35990 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
359a0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
359b0 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
359c0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
359d0 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
359e0 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
359f0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
35a00 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
35a10 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
35a20 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
35a30 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
35a40 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
35a50 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
35a60 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
35a70 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
35a80 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
35a90 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
35aa0 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
35ab0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
35ac0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
35ad0 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
35ae0 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
35af0 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
35b00 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
35b10 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
35b20 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
35b30 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
35b40 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
35b50 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
35b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
35b70 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
35b80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35b90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35ba0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
35bb0 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
35bc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
35bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35be0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
35bf0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
35c00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
35c10 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
35c20 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
35c30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35c40 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
35c50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35c70 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
35c80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
35ca0 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
35cb0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
35cc0 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
35cd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
35ce0 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
35cf0 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
35d00 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
35d10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
35d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
35d30 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
35d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
35d50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47      /* If the PG
35d60 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
35d70 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
35d80 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
35d90 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
35da0 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
35db0 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
35dc0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
35dd0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
35de0 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
35df0 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
35e00 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
35e10 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
35e20 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
35e30 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
35e40 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
35e50 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
35e60 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
35e70 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
35e80 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
35e90 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
35ea0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
35eb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35ec0 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63  E_OK && needSync
35ed0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
35ee0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
35ef0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
35f00 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
35f10 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
35f20 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
35f30 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
35f40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
35f50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
35f60 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
35f70 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
35f80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
35f90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35fa0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
35fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35fc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35fd0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
35fe0 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l==1 );.    pPag
35ff0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
36000 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ll--;.  }else{. 
36010 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
36020 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
36030 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
36040 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
36050 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
36060 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
36070 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
36080 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
36090 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
360a0 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
360b0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
360c0 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
360d0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
360e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
360f0 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
36100 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
36110 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36120 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
36130 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
36140 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
36150 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Y;.}.#endif../*.
36160 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
36170 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
36180 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
36190 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
361a0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
361b0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
361c0 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
361d0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
361e0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
361f0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
36200 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
36210 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
36220 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
36230 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73  .** the page has
36240 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61   been added as a
36250 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65   leaf of the fre
36260 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73  elist and so its
36270 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c  .** content no l
36280 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a  onger matters..*
36290 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
362a0 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
362b0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
362c0 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
362d0 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
362e0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
362f0 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61  s unused. The pa
36300 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
36310 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
36320 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
36330 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
36340 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
36350 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
36360 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
36370 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68  can quadruple th
36380 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
36390 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72   .** DELETE oper
363a0 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ations..*/.void 
363b0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
363c0 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  Write(PgHdr *pPg
363d0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
363e0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
363f0 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  ;.  if( (pPg->fl
36400 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
36410 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76   && pPager->nSav
36420 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  epoint==0 ){.   
36430 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f   PAGERTRACE(("DO
36440 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
36450 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
36460 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
36470 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54  ager)));.    IOT
36480 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
36490 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
364a0 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70  Pg->pgno)).    p
364b0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
364c0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 20  DR_DONT_WRITE;. 
364d0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
364e0 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
364f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
36500 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
36510 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
36520 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
36530 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
36540 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20  change-counter, 
36550 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79  stored as a 4-by
36560 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
36570 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61  teger starting a
36580 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65  t .** byte offse
36590 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  t 24 of the page
365a0 72 20 66 69 6c 65 2e 20 20 54 68 65 20 73 65 63  r file.  The sec
365b0 6f 6e 64 61 72 79 20 63 68 61 6e 67 65 20 63 6f  ondary change co
365c0 75 6e 74 65 72 20 61 74 0a 2a 2a 20 39 32 20 69  unter at.** 92 i
365d0 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2c 20  s also updated, 
365e0 61 73 20 69 73 20 74 68 65 20 53 51 4c 69 74 65  as is the SQLite
365f0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
36600 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
36610 0a 2a 2a 20 42 75 74 20 74 68 69 73 20 6f 6e 6c  .** But this onl
36620 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
36630 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
36640 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
36650 20 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f 20 61 76   false..** To av
36660 6f 69 64 20 65 78 63 65 73 73 20 63 68 75 72 6e  oid excess churn
36670 69 6e 67 20 6f 66 20 70 61 67 65 20 31 2c 20 74  ing of page 1, t
36680 68 65 20 75 70 64 61 74 65 20 6f 6e 6c 79 20 68  he update only h
36690 61 70 70 65 6e 73 20 6f 6e 63 65 2e 0a 2a 2a 20  appens once..** 
366a0 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67  See also the pag
366b0 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
366c0 6f 75 6e 74 65 72 28 29 20 72 6f 75 74 69 6e 65  ounter() routine
366d0 20 74 68 61 74 20 64 6f 65 73 20 61 6e 20 0a 2a   that does an .*
366e0 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  * unconditional 
366f0 75 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68  update of the ch
36700 61 6e 67 65 20 63 6f 75 6e 74 65 72 73 2e 0a 2a  ange counters..*
36710 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
36720 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73  rectMode flag is
36730 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
36740 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c   is done by call
36750 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
36760 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70  agerWrite() on p
36770 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69  age 1, then modi
36780 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
36790 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  ts of the.** pag
367a0 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20  e data. In this 
367b0 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69  case the file wi
367c0 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68  ll be updated wh
367d0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
367e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
367f0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
36800 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f  * The isDirectMo
36810 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  de flag may only
36820 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
36830 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
36840 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
36850 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
36860 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
36870 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
36880 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
36890 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
368a0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
368b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
368c0 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
368d0 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
368e0 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
368f0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
36900 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
36910 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
36920 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
36930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36940 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
36950 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
36960 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
36970 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
36980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36990 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
369a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
369b0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
369c0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
369d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
369e0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
369f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
36a00 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
36a10 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
36a20 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e  * Declare and in
36a30 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e  itialize constan
36a40 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72  t integer 'isDir
36a50 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a  ect'. If the.  *
36a60 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  * atomic-write o
36a70 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65  ptimization is e
36a80 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  nabled in this b
36a90 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72  uild, then isDir
36aa0 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74  ect.  ** is init
36ab0 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
36ac0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
36ad0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
36ae0 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74  parameter.  ** t
36af0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
36b00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
36b10 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
36b20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
36b30 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
36b40 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   if the atomic-w
36b50 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
36b60 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e  n is not.  ** en
36b70 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
36b80 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69   time, the compi
36b90 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65  ler can omit the
36ba0 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27   tests of.  ** '
36bb0 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c  isDirect' below,
36bc0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
36bd0 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69  block enclosed i
36be0 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20  n the.  ** "if( 
36bf0 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64  isDirect )" cond
36c00 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ition..  */.#ifn
36c10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
36c20 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23  E_ATOMIC_WRITE.#
36c30 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
36c40 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20  ODE 0.  assert( 
36c50 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
36c60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
36c70 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
36c80 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  de);.#else.# def
36c90 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
36ca0 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e  isDirectMode.#en
36cb0 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61 67  dif..  if( !pPag
36cc0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
36cd0 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64  one && pPager->d
36ce0 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50  bSize>0 ){.    P
36cf0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20  gHdr *pPgHdr;   
36d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36d10 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  Reference to pag
36d20 65 20 31 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  e 1 */..    asse
36d30 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
36d40 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28  pFile && isOpen(
36d50 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
36d60 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
36d70 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
36d80 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
36d90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36da0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
36db0 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
36dc0 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d   assert( pPgHdr=
36dd0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
36de0 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  _OK );..    /* I
36df0 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66  f page one was f
36e00 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75  etched successfu
36e10 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75  lly, and this fu
36e20 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  nction is not.  
36e30 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69    ** operating i
36e40 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d  n direct-mode, m
36e50 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61  ake page 1 writa
36e60 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69  ble.  When not i
36e70 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  n .    ** direct
36e80 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73   mode, page 1 is
36e90 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20   always held in 
36ea0 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20  cache and hence 
36eb0 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20  the PagerGet(). 
36ec0 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61     ** above is a
36ed0 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c  lways successful
36ee0 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57   - hence the ALW
36ef0 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54  AYS on rc==SQLIT
36f00 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  E_OK..    */.   
36f10 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44   if( !DIRECT_MOD
36f20 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d  E && ALWAYS(rc==
36f30 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
36f40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36f50 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
36f60 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
36f70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36f80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 74   ){.      /* Act
36f90 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 75 70 64  ually do the upd
36fa0 61 74 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  ate of the chang
36fb0 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  e counter */.   
36fc0 20 20 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63     pager_write_c
36fd0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 67  hangecounter(pPg
36fe0 48 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Hdr);..      /* 
36ff0 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
37000 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
37010 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
37020 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
37030 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
37040 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b  ( DIRECT_MODE ){
37050 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
37060 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20  oid *zBuf;.     
37070 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
37080 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
37090 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
370a0 32 28 70 50 61 67 65 72 2c 20 70 50 67 48 64 72  2(pPager, pPgHdr
370b0 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72  ->pData, 1, 6, r
370c0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  c=SQLITE_NOMEM, 
370d0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69  zBuf);.        i
370e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
370f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
37100 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
37110 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  e(pPager->fd, zB
37120 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
37130 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
37140 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
37150 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
37160 54 45 5d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  TE]++;.        }
37170 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
37180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37190 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
371a0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
371b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
371c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
371d0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
371e0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
371f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
37200 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
37210 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
37220 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
37230 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
37240 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
37250 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
37260 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
37270 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54   file to disk. T
37280 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
37290 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
372a0 61 62 61 73 65 73 0a 2a 2a 20 6f 72 20 70 61 67  abases.** or pag
372b0 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65  es with the Page
372c0 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65  r.noSync flag se
372d0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
372e0 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 63 61  essful, or if ca
372f0 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20  lled on a pager 
37300 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20  for which it is 
37310 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a  a no-op, this.**
37320 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
37330 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  s SQLITE_OK. Oth
37340 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72  erwise, an IO er
37350 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
37360 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
37370 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61  ite3PagerSync(Pa
37380 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
37390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
373a0 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
373b0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
373c0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
373d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
373e0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
373f0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
37400 6e 63 46 6c 61 67 73 29 3b 0a 20 20 7d 65 6c 73  ncFlags);.  }els
37410 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61  e if( isOpen(pPa
37420 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
37430 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
37440 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
37450 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
37460 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
37470 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d  TE_FCNTL_SYNC_OM
37480 49 54 54 45 44 2c 20 30 29 3b 0a 20 20 20 20 69  ITTED, 0);.    i
37490 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
374a0 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  TFOUND ){.      
374b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
374c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
374d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
374e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
374f0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
37500 20 77 68 69 6c 65 20 61 20 77 72 69 74 65 2d 74   while a write-t
37510 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
37520 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62  tive in.** rollb
37530 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e  ack. If the conn
37540 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c  ection is in WAL
37550 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6c 6c   mode, this call
37560 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a   is a no-op. .**
37570 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
37580 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f  he connection do
37590 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  es not already h
375a0 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ave an EXCLUSIVE
375b0 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65   lock on .** the
375c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
375d0 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
375e0 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65  de to obtain one
375f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
37600 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
37610 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 6f 72   already held or
37620 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
37630 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20  obtain it is.** 
37640 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 74  successful, or t
37650 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
37660 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51   in WAL mode, SQ
37670 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
37680 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
37690 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  e, either SQLITE
376a0 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51 4c 49  _BUSY or an SQLI
376b0 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
376c0 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
376d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
376e0 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
376f0 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65 72 20  usiveLock(Pager 
37700 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
37710 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37720 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37730 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37740 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
37750 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
37760 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37770 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20  _WRITER_DBMOD . 
37780 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37790 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
377a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20  RITER_LOCKED .  
377b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
377c0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
377d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28  pPager) );.  if(
377e0 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61 6c 28   0==pagerUseWal(
377f0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
37800 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
37810 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
37820 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
37830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
37850 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37860 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
37870 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
37880 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
37890 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
378a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
378b0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
378c0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
378d0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
378e0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
378f0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
37900 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
37910 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
37920 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
37930 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
37940 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
37950 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
37960 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a  ensures that:.**
37970 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
37980 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
37990 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61  -counter is upda
379a0 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20  ted,.**   * the 
379b0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
379c0 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74  d (unless the at
379d0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
379e0 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29  ization is used)
379f0 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72  ,.**   * all dir
37a00 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69  ty pages are wri
37a10 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
37a20 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20  base file, .**  
37a30 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
37a40 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
37a50 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  d (if required),
37a60 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
37a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
37a80 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nced. .**.** The
37a90 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
37aa0 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
37ab0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
37ac0 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a  on is to finaliz
37ad0 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74  e .** (delete, t
37ae0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
37af0 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
37b00 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  f) the journal f
37b10 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65  ile (or .** dele
37b20 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
37b30 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
37b40 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
37b50 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
37b60 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
37b70 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
37b80 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
37b90 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
37ba0 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
37bb0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
37bc0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
37bd0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
37be0 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
37bf0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
37c00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37c10 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
37c20 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
37c30 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
37c40 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
37c50 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
37c60 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
37c70 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
37c80 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
37c90 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
37ca0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
37cb0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
37cc0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
37cd0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
37ce0 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
37cf0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
37d00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
37d10 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
37d20 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
37d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
37d40 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
37d50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
37d60 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  name */.  int no
37d70 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
37d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
37d90 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53  e to omit the xS
37da0 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ync on the db fi
37db0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
37dc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
37dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37de0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
37df0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37e00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37e10 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
37e20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37e30 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37e40 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
37e50 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37e60 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37e70 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
37e80 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37e90 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
37ea0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37eb0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37ec0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
37ed0 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 72  * If a prior err
37ee0 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70  or occurred, rep
37ef0 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 61  ort that error a
37f00 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  gain. */.  if( N
37f10 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
37f20 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
37f30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37f40 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
37f50 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
37f60 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
37f70 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a  s nSize=%d\n", .
37f80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
37f90 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
37fa0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
37fb0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20  ));..  /* If no 
37fc0 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
37fd0 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c   have been made,
37fe0 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
37ff0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
38000 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49  eState<PAGER_WRI
38010 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 20 72  TER_CACHEMOD ) r
38020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
38030 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ..  if( MEMDB ){
38040 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
38050 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
38060 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
38070 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
38080 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
38090 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
380a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
380b0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73  alled, it is mos
380c0 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f  tly a no-op.  Ho
380d0 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a  wever, any.    *
380e0 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67  * backup in prog
380f0 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65  ress needs to be
38100 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20   restarted..    
38110 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  */.    sqlite3Ba
38120 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
38130 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
38140 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
38150 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
38160 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  r) ){.      PgHd
38170 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r *pList = sqlit
38180 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
38190 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
381a0 65 29 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  e);.      PgHdr 
381b0 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30 3b 0a 20  *pPageOne = 0;. 
381c0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d       if( pList==
381d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
381e0 4d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65 61  Must have at lea
381f0 73 74 20 6f 6e 65 20 70 61 67 65 20 66 6f 72 20  st one page for 
38200 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69 74 20 66  the WAL commit f
38210 6c 61 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lag..        ** 
38220 54 69 63 6b 65 74 20 5b 32 64 31 61 35 63 36 37  Ticket [2d1a5c67
38230 64 66 63 32 33 36 33 65 34 34 66 32 39 64 39 62  dfc2363e44f29d9b
38240 62 64 35 37 66 5d 20 32 30 31 31 2d 30 35 2d 31  bd57f] 2011-05-1
38250 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  8 */.        rc 
38260 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
38270 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
38280 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20 20 20  ageOne);.       
38290 20 70 4c 69 73 74 20 3d 20 70 50 61 67 65 4f 6e   pList = pPageOn
382a0 65 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  e;.        pList
382b0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
382c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
382d0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
382e0 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41  K );.      if( A
382f0 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
38300 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
38310 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
38320 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65  er, pList, pPage
38330 72 2d 3e 64 62 53 69 7a 65 2c 20 31 29 3b 0a 20  r->dbSize, 1);. 
38340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
38350 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
38360 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20 20  PageOne);.      
38370 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
38380 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
38390 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
383a0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
383b0 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  he);.      }.   
383c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
383d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
383e0 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
383f0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
38400 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
38410 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68        ** does th
38420 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
38430 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
38440 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
38450 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
38460 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
38470 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
38480 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
38490 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
384a0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75  the .      ** ru
384b0 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
384c0 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
384d0 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ion: .      **. 
384e0 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65       **    * The
384f0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
38500 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
38510 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
38520 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  for.      **    
38530 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
38540 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
38550 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
38560 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
38570 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
38580 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
38590 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  on, and.      **
385a0 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
385b0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
385c0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
385d0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
385e0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  l file..      **
385f0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
38600 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
38610 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
38620 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
38630 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hen the.      **
38640 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
38650 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
38660 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
38670 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
38680 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75  nge.      ** cou
38690 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63  nter in 'indirec
386a0 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20  t-mode'. If the 
386b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
386c0 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a  compiled in but.
386d0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
386e0 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68  applicable to th
386f0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
38700 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a