/ Hex Artifact Content
Login

Artifact 47f13c194a980ed55dd4825f286d40d49c4a7093:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   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 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, 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 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 6f 74 61  codes..**.** ota
7140: 4d 6f 64 65 0a 2a 2a 20 20 20 54 68 69 73 20 76  Mode.**   This v
7150: 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 72 6d 61  ariable is norma
7160: 6c 6c 79 20 30 2e 20 49 74 20 69 73 20 73 65 74  lly 0. It is set
7170: 20 74 6f 20 31 20 62 79 20 74 68 65 20 50 61 67   to 1 by the Pag
7180: 65 72 53 65 74 4f 74 61 4d 6f 64 65 28 29 0a 2a  erSetOtaMode().*
7190: 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61  *   function - a
71a0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
71b0: 22 50 52 41 47 4d 41 20 70 61 67 65 72 5f 6f 74  "PRAGMA pager_ot
71c0: 61 5f 6d 6f 64 65 3d 31 22 20 63 6f 6d 6d 61 6e  a_mode=1" comman
71d0: 64 2e 20 4f 6e 63 65 20 0a 2a 2a 20 20 20 74 68  d. Once .**   th
71e0: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 68 61 73  e *-oal file has
71f0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64   been opened and
7200: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 65 74   it has been det
7210: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
7220: 20 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 20   .**   database 
7230: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
7240: 6e 20 6d 6f 64 69 66 69 65 64 20 73 69 6e 63 65  n modified since
7250: 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2c   it was created,
7260: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 0a   this variable .
7270: 2a 2a 20 20 20 69 73 20 73 65 74 20 74 6f 20 32  **   is set to 2
7280: 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20  ..**.**   It is 
7290: 61 6c 73 6f 20 70 6f 73 73 69 62 6c 65 20 74 6f  also possible to
72a0: 20 75 73 65 20 50 61 67 65 72 53 65 74 4f 74 61   use PagerSetOta
72b0: 4d 6f 64 65 28 29 20 74 6f 20 32 20 69 66 20 74  Mode() to 2 if t
72c0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
72d0: 2a 20 20 20 61 6c 72 65 61 64 79 20 69 6e 20 57  *   already in W
72e0: 41 4c 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  AL mode. In this
72f0: 20 63 61 73 65 20 74 68 65 20 6f 6e 6c 79 20 65   case the only e
7300: 66 66 65 63 74 20 69 73 20 74 6f 20 70 72 65 76  ffect is to prev
7310: 65 6e 74 20 74 68 65 0a 2a 2a 20 20 20 63 6f 6e  ent the.**   con
7320: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 20 63 68 65  nection from che
7330: 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64  ckpointing the d
7340: 62 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  b as part of an 
7350: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
7360: 65 28 29 0a 2a 2a 20 20 20 63 61 6c 6c 2e 0a 2a  e().**   call..*
7370: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
7380: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
7390: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
73a0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
73b0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
73c0: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
73d0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
73e0: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
73f0: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
7400: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
7410: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
7420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
7430: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
7440: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
7450: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
7460: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7470: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
7480: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
7490: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
74a0: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
74c0: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
74d0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
74e0: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
74f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7500: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7510: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7520: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
7530: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
7540: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
7550: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
7560: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
7570: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
7580: 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61 67    u8 walSyncFlag
7590: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
75a0: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
75b0: 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77 61  SYNC_FULL for wa
75c0: 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75 38  l writes */.  u8
75d0: 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20   syncFlags;     
75e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
75f0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7600: 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 20  _FULL otherwise 
7610: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
7620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7630: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
7640: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
7650: 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20 2a  immutable file *
7660: 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20 20  /.  u8 noLock;  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20 28  /* Do not lock (
7690: 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d 6f  except in WAL mo
76a0: 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  de) */.  u8 read
76b0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
76c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
76d0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
76e0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
76f0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
7700: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7710: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
7720: 6c 65 20 49 2f 4f 20 2a 2f 0a 23 69 66 64 65 66  le I/O */.#ifdef
7730: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
7740: 54 41 0a 20 20 75 38 20 6f 74 61 4d 6f 64 65 3b  TA.  u8 otaMode;
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
7770: 69 6e 20 6f 74 61 5f 6d 6f 64 65 20 2a 2f 0a 23  in ota_mode */.#
7780: 65 6e 64 69 66 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a  endif..  /******
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ****.  ** The fo
77e0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
77f0: 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61  ntains those cla
7800: 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ss members that 
7810: 63 68 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20  change during.  
7820: 2a 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61  ** routine opera
7830: 74 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d  tion.  Class mem
7840: 62 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73  bers not in this
7850: 20 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65   block are eithe
7860: 72 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65  r fixed.  ** whe
7870: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 66  n the pager is f
7880: 69 72 73 74 20 63 72 65 61 74 65 64 20 6f 72 20  irst created or 
7890: 65 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65  else only change
78a0: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
78b0: 0a 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e  .  ** significan
78c0: 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73  t mode change (s
78d0: 75 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20  uch as changing 
78e0: 74 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c  the page_size, l
78f0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a  ocking_mode,.  *
7900: 2a 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * or the journal
7910: 5f 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e  _mode).  From an
7920: 6f 74 68 65 72 20 76 69 65 77 2c 20 74 68 65 73  other view, thes
7930: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
7940: 64 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68  describe.  ** th
7950: 65 20 22 73 74 61 74 65 22 20 6f 66 20 74 68 65  e "state" of the
7960: 20 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74   pager, while ot
7970: 68 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  her class member
7980: 73 20 64 65 73 63 72 69 62 65 20 74 68 65 0a 20  s describe the. 
7990: 20 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69   ** "configurati
79a0: 6f 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65 72  on" of the pager
79b0: 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61  ..  */.  u8 eSta
79c0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
79d0: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
79e0: 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45  ate (OPEN, READE
79f0: 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  R, WRITER_LOCKED
7a00: 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63  ..) */.  u8 eLoc
7a10: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
7a20: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
7a30: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74  lock held on dat
7a40: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a50: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
7a60: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
7a70: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
7a80: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
7a90: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
7aa0: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
7ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7ac0: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
7ad0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
7ae0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
7af0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
7b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
7b10: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
7b20: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
7b30: 6f 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e  o */.  u8 subjIn
7b40: 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20  Memory;         
7b50: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
7b60: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d  e in-memory sub-
7b70: 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67  journals */.  Pg
7b80: 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  no dbSize;      
7b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7ba0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7bb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
7bc0: 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a    Pgno dbOrigSiz
7bd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7be0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
7bf0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
7c00: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f  action */.  Pgno
7c10: 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20   dbFileSize;    
7c20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7c30: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
7c40: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
7c50: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69 6e 74  */.  Pgno dbHint
7c60: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
7c70: 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73 65 64   /* Value passed
7c80: 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48   to FCNTL_SIZE_H
7c90: 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  INT call */.  in
7ca0: 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20  t errCode;      
7cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
7cc0: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
7cd0: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
7ce0: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d00: 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64  Pages journalled
7d10: 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65   since last j-he
7d20: 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ader written */.
7d30: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d50: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
7d60: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
7d70: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
7d80: 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20   u32 nSubRec;   
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7da0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
7db0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62  s written to sub
7dc0: 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69  -journal */.  Bi
7dd0: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
7de0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
7df0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
7e00: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
7e10: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  se file */.  sql
7e20: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
7e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7e40: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7e50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
7e60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
7e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7e80: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7e90: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
7ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7eb0: 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *sjfd;         /
7ec0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7ed0: 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  r for sub-journa
7ee0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
7ef0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
7f00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
7f10: 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ite offset in th
7f20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
7f30: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
7f40: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
7f50: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
7f60: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
7f70: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73  al header */.  s
7f80: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
7f90: 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f  Backup;    /* Po
7fa0: 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66  inter to list of
7fb0: 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20   ongoing backup 
7fc0: 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50  processes */.  P
7fd0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
7fe0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
7ff0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
8000: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
8010: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
8020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8030: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
8040: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
8050: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
8060: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
8070: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
8080: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
8090: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  le changes */.. 
80a0: 20 75 38 20 62 55 73 65 46 65 74 63 68 3b 20 20   u8 bUseFetch;  
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
80c0: 54 72 75 65 20 74 6f 20 75 73 65 20 78 46 65 74  True to use xFet
80d0: 63 68 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ch() */.  int nM
80e0: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
80f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8100: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
8110: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
8120: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
8130: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
8140: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
8150: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
8160: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
8170: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
8180: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
8190: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
81a0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
81b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
81c0: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
81d0: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
81e0: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8230: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8240: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8250: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
8260: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
8270: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
8280: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
8290: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
82a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
82b0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
82c0: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
82d0: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
82e0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
82f0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8300: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8310: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8320: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8330: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8340: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8350: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
8360: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8380: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8390: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
83a0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
83b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
83c0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
83d0: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
83e0: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
83f0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8400: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8410: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8420: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8430: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8440: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8450: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
8460: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
8470: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
8480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8490: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
84a0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
84b0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
84c0: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
84d0: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
84e0: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
84f0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8500: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8510: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8520: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8530: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8550: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
8560: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
8570: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
8580: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
8590: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
85a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
85b0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
85c0: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
85d0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
85e0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
85f0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8600: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8610: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8620: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8630: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8640: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8650: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
8660: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
8670: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8680: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8690: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
86a0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
86b0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
86c0: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
86d0: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
86e0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
86f0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8700: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8710: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8730: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8740: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8750: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
8760: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
8770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8780: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8790: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
87a0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
87b0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
87c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
87d0: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
87e0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
87f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8800: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8820: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8830: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8840: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8850: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8880: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8890: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
88a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
88b0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 61   value of the pa
88c0: 67 65 72 20 6f 74 61 4d 6f 64 65 20 66 6c 61 67  ger otaMode flag
88d0: 20 28 30 2c 20 31 20 6f 72 20 32 29 2e 20 4f 72   (0, 1 or 2). Or
88e0: 2c 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  , if.** SQLITE_E
88f0: 4e 41 42 4c 45 5f 4f 54 41 20 69 73 20 6e 6f 74  NABLE_OTA is not
8900: 20 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72 6e   defined, return
8910: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20   constant value 
8920: 30 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  0..*/.#ifdef SQL
8930: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 54 41 0a 23  ITE_ENABLE_OTA.#
8940: 20 64 65 66 69 6e 65 20 50 61 67 65 72 4f 74 61   define PagerOta
8950: 4d 6f 64 65 28 70 50 61 67 65 72 29 20 28 28 70  Mode(pPager) ((p
8960: 50 61 67 65 72 29 2d 3e 6f 74 61 4d 6f 64 65 29  Pager)->otaMode)
8970: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8980: 50 61 67 65 72 4f 74 61 4d 6f 64 65 28 70 50 61  PagerOtaMode(pPa
8990: 67 65 72 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  ger) 0.#endif../
89a0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89b0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89c0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89d0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89e0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
89f0: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a00: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a10: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a20: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a30: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a40: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a50: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a60: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a70: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a80: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8a90: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8aa0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ab0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8ac0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
8ad0: 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e  iables hold coun
8ae0: 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  ters used for.**
8af0: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
8b00: 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76  s only.  These v
8b10: 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  ariables do not 
8b20: 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f  exist in.** a no
8b30: 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e  n-testing build.
8b40: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
8b50: 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  s are not thread
8b60: 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  -safe..*/.#ifdef
8b70: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
8b80: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
8b90: 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  eaddb_count = 0;
8ba0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8bb0: 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64   full pages read
8bc0: 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20   from DB */.int 
8bd0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8be0: 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  itedb_count = 0;
8bf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8c00: 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74  full pages writt
8c10: 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20  en to DB */.int 
8c20: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8c30: 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  itej_count = 0; 
8c40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8c50: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c60: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65   journal */.# de
8c70: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8c80: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
8c90: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8ca0: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
8cb0: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
8cc0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
8cd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
8ce0: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
8cf0: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
8d00: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
8d10: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
8d20: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
8d30: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
8d40: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
8d50: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
8d60: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
8d70: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
8d80: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
8d90: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
8da0: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
8db0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
8dc0: 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72  l is being.** wr
8dd0: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
8de0: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
8df0: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
8e00: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
8e10: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
8e20: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
8e30: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
8e40: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
8e50: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
8e60: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
8e70: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
8e80: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
8e90: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
8ea0: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
8eb0: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
8ec0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
8ed0: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
8ee0: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
8ef0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
8f00: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8f10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
8f20: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
8f30: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
8f40: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
8f50: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
8f60: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
8f70: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
8f80: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
8f90: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
8fa0: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
8fb0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
8fc0: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
8fd0: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
8fe0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
8ff0: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
9000: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
9010: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
9020: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
9030: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
9040: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
9050: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
9060: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
9070: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
9080: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
9090: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
90a0: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
90b0: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
90c0: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
90d0: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
90e0: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
90f0: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
9100: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
9110: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
9120: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
9130: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
9140: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
9150: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
9160: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
9170: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
9180: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
9190: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
91a0: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
91b0: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
91c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
91d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
91e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
91f0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
9200: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
9210: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
9220: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
9230: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
9240: 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f  f each page reco
9250: 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  rd in the journa
9260: 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  l is given by.**
9270: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
9280: 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  acro..*/.#define
9290: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
92a0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
92b0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
92c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
92d0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
92e0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
92f0: 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
9300: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a  the same .** siz
9310: 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69  e as a single di
9320: 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61  sk sector. See a
9330: 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a  lso setSectorSiz
9340: 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e()..*/.#define 
9350: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9360: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
9370: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
9380: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
9390: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
93a0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
93b0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
93c0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
93d0: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
93e0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
93f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
9400: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
9410: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
9420: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
9430: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
9440: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
9450: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
9460: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
9470: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
9480: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
9490: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
94a0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
94b0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
94c0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
94d0: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
94e0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53 45  ** The macro USE
94f0: 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69 66  FETCH is true if
9500: 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20   we are allowed 
9510: 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74 63  to use the xFetc
9520: 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a  h and xUnfetch.*
9530: 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  * interfaces to 
9540: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
9550: 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79  ase using memory
9560: 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a  -mapped I/O..*/.
9570: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
9580: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66  MAP_SIZE>0.# def
9590: 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29 20  ine USEFETCH(x) 
95a0: 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68 29  ((x)->bUseFetch)
95b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
95c0: 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23 65  USEFETCH(x) 0.#e
95d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
95e0: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
95f0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
9600: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
9610: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
9620: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
9630: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
9640: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
9650: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
9660: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
9670: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
9680: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
9690: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
96a0: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
96b0: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
96c0: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
96d0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
96e0: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
96f0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
9700: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
9710: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
9720: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
9730: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
9740: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
9750: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
9760: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
9770: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
9780: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
9790: 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65 73   this pager uses
97a0: 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c   a write-ahead l
97b0: 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  og instead of th
97c0: 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62  e usual.** rollb
97d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68  ack journal. Oth
97e0: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
97f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9800: 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20  OMIT_WAL.static 
9810: 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c 28  int pagerUseWal(
9820: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
9830: 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
9840: 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65  ->pWal!=0);.}.#e
9850: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
9860: 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20  erUseWal(x) 0.# 
9870: 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c  define pagerRoll
9880: 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64  backWal(x) 0.# d
9890: 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72  efine pagerWalFr
98a0: 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a  ames(v,w,x,y) 0.
98b0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70  # define pagerOp
98c0: 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a  enWalIfPresent(z
98d0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65  ) SQLITE_OK.# de
98e0: 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52  fine pagerBeginR
98f0: 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a  eadTransaction(z
9900: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
9910: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  if..static int p
9920: 61 67 65 72 4f 70 65 6e 57 61 6c 49 6e 74 65 72  agerOpenWalInter
9930: 6e 61 6c 28 50 61 67 65 72 2a 2c 20 69 6e 74 2a  nal(Pager*, int*
9940: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
9950: 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  UG ./*.** Usage:
9960: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
9970: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
9980: 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a  ate(pPager) );.*
9990: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
99a0: 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73  on runs many ass
99b0: 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66  erts to try to f
99c0: 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  ind inconsistenc
99d0: 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e  ies in.** the in
99e0: 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
99f0: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
9a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9a10: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
9a20: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
9a30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
9a40: 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d  p;..  /* State m
9a50: 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f  ust be valid. */
9a60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53  .  assert( p->eS
9a70: 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
9a80: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9a90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
9aa0: 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ER.       || p->
9ab0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9ac0: 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
9ad0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9ae0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
9af0: 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
9b00: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9b10: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
9b20: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9b30: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9b40: 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20  _FINISHED.      
9b50: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9b60: 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a  AGER_ERROR.  );.
9b70: 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73  .  /* Regardless
9b80: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
9b90: 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69  state, a temp-fi
9ba0: 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  le connection al
9bb0: 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a  ways behaves.  *
9bc0: 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20 61  * as if it has a
9bd0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
9be0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
9bf0: 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20   file. It never 
9c00: 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65  updates.  ** the
9c10: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
9c20: 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68  field, so the ch
9c30: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
9c40: 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  ag is always set
9c50: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9c60: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9c70: 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  || p->eLock==EXC
9c80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
9c90: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9ca0: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  File==0 || pPage
9cb0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
9cc0: 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ne );..  /* If t
9cd0: 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c  he useJournal fl
9ce0: 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65  ag is clear, the
9cf0: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75   journal-mode mu
9d00: 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20  st be "OFF". .  
9d10: 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f  ** And if the jo
9d20: 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f  urnal-mode is "O
9d30: 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  FF", the journal
9d40: 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62   file must not b
9d50: 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61  e open..  */.  a
9d60: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9d70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9d80: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20  RNALMODE_OFF || 
9d90: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  p->useJournal );
9da0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9db0: 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
9dc0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9dd0: 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a   || !isOpen(p->j
9de0: 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  fd) );..  /* Che
9df0: 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d  ck that MEMDB im
9e00: 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e  plies noSync. An
9e10: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  d an in-memory j
9e20: 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20  ournal. Since . 
9e30: 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20 61   ** this means a
9e40: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9e50: 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f  r performs no IO
9e60: 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e   at all, it cann
9e70: 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20  ot encounter .  
9e80: 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  ** either SQLITE
9e90: 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45  _IOERR or SQLITE
9ea0: 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c  _FULL during rol
9eb0: 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20 66  lback or while f
9ec0: 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20  inalizing .  ** 
9ed0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
9ee0: 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69 6e  (although the in
9ef0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
9f00: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
9f10: 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  ay .  ** return 
9f20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
9f30: 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  EM while the jou
9f40: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
9f50: 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74 20  ng written). It 
9f60: 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f  .  ** is therefo
9f70: 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
9f80: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
9f90: 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
9fa0: 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20  the ERROR .  ** 
9fb0: 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  state..  */.  if
9fc0: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61  ( MEMDB ){.    a
9fd0: 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63  ssert( p->noSync
9fe0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9ff0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a000: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a010: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a020: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a030: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a040: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
a050: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a060: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a070: 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74  _ERROR && p->eSt
a080: 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
a090: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a0a0: 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30  agerUseWal(p)==0
a0b0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
a0c0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
a0d0: 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45 52   is set, a RESER
a0e0: 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  VED lock or grea
a0f0: 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
a100: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c  .  ** on the fil
a110: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
a120: 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  ( pPager->change
a130: 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20  CountDone==0 || 
a140: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52  pPager->eLock>=R
a150: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a160: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a170: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
a180: 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
a190: 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
a1a0: 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a  case PAGER_OPEN:
a1b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
a1c0: 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61  MEMDB );.      a
a1d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a1e0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a1f0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a200: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
a210: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
a220: 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20  >pPCache)==0 || 
a230: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
a240: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a250: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a260: 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61  _READER:.      a
a270: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a280: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a290: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a2a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a2b0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a2c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a2d0: 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
a2e0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a2f0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a300: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a  _WRITER_LOCKED:.
a310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a320: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
a330: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a340: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a350: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a360: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
a370: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a380: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  r) ){.        as
a390: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a3a0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
a3b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a3c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a3d0: 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  bSize==pPager->d
a3e0: 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  bOrigSize );.   
a3f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a400: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a410: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
a420: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a430: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a440: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a450: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a460: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a470: 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20  r->setMaster==0 
a480: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a490: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a4a0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a  WRITER_CACHEMOD:
a4b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4c0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a4d0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a4e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a4f0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a500: 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  K );.      if( !
a510: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a520: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  er) ){.        /
a530: 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
a540: 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c   that if journal
a550: 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74  _mode=wal here t
a560: 68 61 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a  hat neither the.
a570: 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
a580: 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20  al file nor the 
a590: 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65  WAL file are ope
a5a0: 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  n. This happens 
a5b0: 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  during.        *
a5c0: 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61  * a rollback tra
a5d0: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77  nsaction that sw
a5e0: 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72  itches from jour
a5f0: 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20  nal_mode=off.   
a600: 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e       ** to journ
a610: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20  al_mode=wal..   
a620: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a630: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a640: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a650: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a660: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a670: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
a680: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a690: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a6a0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a6b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a6c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a6d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a6e0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
a6f0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a700: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a710: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a720: 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  FileSize );.    
a730: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a740: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a750: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a760: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a770: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a780: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20  _WRITER_DBMOD:. 
a790: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a7a0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a7b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a7c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a7d0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a7e0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a7f0: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a800: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a810: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a820: 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k>=EXCLUSIVE_LOC
a830: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a840: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a850: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a860: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a870: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a880: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a890: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a8a0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a8b0: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a8c0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
a8d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a8e0: 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e  igSize<=pPager->
a8f0: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
a900: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a910: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a920: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20  R_FINISHED:.    
a930: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a940: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a950: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a960: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a970: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a980: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a990: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a9a0: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a9b0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
a9c0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
a9d0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a9e0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a9f0: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
aa00: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
aa10: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aa20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
aa30: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62        );.      b
aa40: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
aa50: 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20  PAGER_ERROR:.   
aa60: 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74     /* There must
aa70: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
aa80: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
aa90: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
aaa0: 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ger if.      ** 
aab0: 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  in ERROR state. 
aac0: 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 70 61  Otherwise the pa
aad0: 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ger should have 
aae0: 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a  already dropped.
aaf0: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f        ** back to
ab00: 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20   OPEN state..   
ab10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
ab20: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
ab30: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
ab40: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ab50: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
ab60: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
ab70: 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20 20 20  Cache)>0 );.    
ab80: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
ab90: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
aba0: 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45  if /* ifndef NDE
abb0: 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BUG */..#ifdef S
abc0: 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a  QLITE_DEBUG ./*.
abd0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
abe0: 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e 20 72  ter to a human r
abf0: 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67 20 69  eadable string i
ac00: 6e 20 61 20 73 74 61 74 69 63 20 62 75 66 66 65  n a static buffe
ac10: 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  r.** containing 
ac20: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
ac30: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
ac40: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
ac50: 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ent. This.** is 
ac60: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
ac70: 73 65 64 20 77 69 74 68 69 6e 20 64 65 62 75 67  sed within debug
ac80: 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  gers. For exampl
ac90: 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72 6e 61  e, as an alterna
aca0: 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e  tive.** to "prin
acb0: 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20 67 64  t *pPager" in gd
acc0: 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70  b:.**.** (gdb) p
acd0: 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72 69 6e  rintf "%s", prin
ace0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
acf0: 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ager).*/.static 
ad00: 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65  char *print_page
ad10: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
ad20: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
ad30: 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20   zRet[1024];..  
ad40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ad50: 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20  (1024, zRet,.   
ad60: 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20     "Filename:   
ad70: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
ad80: 53 74 61 74 65 3a 20 20 20 20 20 20 20 20 20 25  State:         %
ad90: 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a  s errCode=%d\n".
ada0: 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20        "Lock:    
adb0: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
adc0: 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a    "Locking mode:
add0: 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25    locking_mode=%
ade0: 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  s\n".      "Jour
adf0: 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e  nal mode:  journ
ae00: 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20  al_mode=%s\n".  
ae10: 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f      "Backing sto
ae20: 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20  re: tempFile=%d 
ae30: 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72  memDb=%d useJour
ae40: 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  nal=%d\n".      
ae50: 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20  "Journal:       
ae60: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20  journalOff=%lld 
ae70: 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c  journalHdr=%lld\
ae80: 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20  n".      "Size: 
ae90: 20 20 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d           dbsize=
aea0: 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64  %d dbOrigSize=%d
aeb0: 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e   dbFileSize=%d\n
aec0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69  ".      , p->zFi
aed0: 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70  lename.      , p
aee0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
aef0: 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 20  OPEN            
af00: 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20  ? "OPEN" :.     
af10: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
af20: 47 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20  GER_READER      
af30: 20 20 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a      ? "READER" :
af40: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
af50: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
af60: 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49  _LOCKED   ? "WRI
af70: 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20  TER_LOCKED" :.  
af80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
af90: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
afa0: 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52  CHEMOD ? "WRITER
afb0: 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20  _CACHEMOD" :.   
afc0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
afd0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
afe0: 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f  OD    ? "WRITER_
aff0: 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20  DBMOD" :.       
b000: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b010: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
b020: 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49  D ? "WRITER_FINI
b030: 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  SHED" :.        
b040: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b050: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
b060: 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65   ? "ERROR" : "?e
b070: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
b080: 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20  int)p->errCode. 
b090: 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d       , p->eLock=
b0a0: 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20  =NO_LOCK        
b0b0: 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20   ? "NO_LOCK" :. 
b0c0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b0d0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20  =RESERVED_LOCK  
b0e0: 20 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a   ? "RESERVED" :.
b0f0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
b100: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b110: 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20    ? "EXCLUSIVE" 
b120: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
b130: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b140: 20 20 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a      ? "SHARED" :
b150: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
b160: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
b170: 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a     ? "UNKNOWN" :
b180: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
b190: 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d   , p->exclusiveM
b1a0: 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65  ode ? "exclusive
b1b0: 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20  " : "normal".   
b1c0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d     , p->journalM
b1d0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b1e0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
b1f0: 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20  ? "memory" :.   
b200: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
b210: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b220: 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
b230: 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20  ? "off" :.      
b240: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b250: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b260: 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22  ODE_DELETE   ? "
b270: 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20  delete" :.      
b280: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b290: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b2a0: 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22  ODE_PERSIST  ? "
b2b0: 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20  persist" :.     
b2c0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b2d0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b2e0: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20  MODE_TRUNCATE ? 
b2f0: 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20  "truncate" :.   
b300: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
b310: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b320: 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20  ALMODE_WAL      
b330: 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f  ? "wal" : "?erro
b340: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
b350: 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69  )p->tempFile, (i
b360: 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e  nt)p->memDb, (in
b370: 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a  t)p->useJournal.
b380: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
b390: 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61  alOff, p->journa
b3a0: 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e  lHdr.      , (in
b3b0: 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e  t)p->dbSize, (in
b3c0: 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c  t)p->dbOrigSize,
b3d0: 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53   (int)p->dbFileS
b3e0: 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  ize.  );..  retu
b3f0: 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn zRet;.}.#endi
b400: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
b410: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
b420: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
b430: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
b440: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
b450: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
b460: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
b470: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
b480: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
b490: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
b4a0: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
b4b0: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
b4c0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
b4d0: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
b4e0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
b4f0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b500: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
b510: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
b520: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
b530: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
b540: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
b550: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
b560: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
b570: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
b580: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
b590: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
b5a0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
b5b0: 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72 53  pPager;.  PagerS
b5c0: 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50  avepoint *p;.  P
b5d0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
b5e0: 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pgno;.  int i;. 
b5f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
b600: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
b610: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  i++){.    p = &p
b620: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
b630: 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  t[i];.    if( p-
b640: 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20  >nOrig>=pgno && 
b650: 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  0==sqlite3Bitvec
b660: 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  Test(p->pInSavep
b670: 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  oint, pgno) ){. 
b680: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b690: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b6a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
b6b0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
b6c0: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
b6d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b6e0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b6f0: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
b700: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
b710: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
b720: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
b730: 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
b740: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
b750: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
b760: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
b770: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
b780: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b790: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
b7a0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
b7b0: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
b7c0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
b7d0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
b7e0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
b7f0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
b800: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b810: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
b820: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
b830: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
b840: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
b850: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
b860: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
b870: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
b880: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
b890: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b8a0: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
b8b0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
b8c0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
b8d0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
b8e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b8f0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
b900: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
b910: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
b920: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
b930: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b940: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
b950: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
b960: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
b970: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
b980: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
b990: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
b9a0: 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a  (u8*)A,B).../*.*
b9b0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
b9c0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
b9d0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
b9e0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
b9f0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
ba00: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
ba10: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
ba20: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
ba30: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
ba40: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
ba50: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
ba60: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
ba70: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
ba80: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
ba90: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
baa0: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
bab0: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
bac0: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  et);.}../*.** Un
bad0: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
bae0: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
baf0: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bb00: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
bb10: 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44  OCK.** or SHARED
bb20: 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73  _LOCK. Regardles
bb30: 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
bb40: 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  not the call to 
bb50: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63  xUnlock().** suc
bb60: 63 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50  ceeds, set the P
bb70: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
bb80: 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ble to match the
bb90: 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77   (attempted) new
bba0: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63   lock..**.** Exc
bbb0: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
bbc0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
bbd0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
bbe0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bbf0: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
bc00: 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65  ot modify it. Se
bc10: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
bc20: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
bc30: 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c  of .** UNKNOWN_L
bc40: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
bc50: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a  nation of this..
bc60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
bc70: 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65  gerUnlockDb(Page
bc80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bc90: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bca0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bcb0: 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
bcc0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
bcd0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
bce0: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65  =eLock );.  asse
bcf0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  rt( eLock==NO_LO
bd00: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41  CK || eLock==SHA
bd10: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
bd20: 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f  sert( eLock!=NO_
bd30: 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65  LOCK || pagerUse
bd40: 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
bd50: 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
bd60: 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
bd70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bd80: 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29  ->eLock>=eLock )
bd90: 3b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  ;.    rc = pPage
bda0: 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49  r->noLock ? SQLI
bdb0: 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f  TE_OK : sqlite3O
bdc0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
bdd0: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
bde0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
bdf0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
be00: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
be10: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
be20: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  ck;.    }.    IO
be30: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
be40: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
be50: 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72   eLock)).  }.  r
be60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
be70: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61  ** Lock the data
be80: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
be90: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
bea0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
beb0: 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52  HARED_LOCK,.** R
bec0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
bed0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
bee0: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
bef0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
bf00: 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c   the.** Pager.eL
bf10: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
bf20: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
bf30: 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  state. .**.** Ex
bf40: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
bf50: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
bf60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
bf70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
bf80: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  s .** called, do
bf90: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75   not modify it u
bfa0: 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f  nless the new lo
bfb0: 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45  cking state is E
bfc0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a  XCLUSIVE_LOCK. .
bfd0: 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  ** See the comme
bfe0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
bff0: 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f  fine of UNKNOWN_
c000: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
c010: 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74  anation .** of t
c020: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c030: 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50  nt pagerLockDb(P
c040: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c050: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
c060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c070: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c080: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
c090: 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44   eLock==RESERVED
c0a0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
c0b0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
c0c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c0d0: 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70  eLock<eLock || p
c0e0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
c0f0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
c100: 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e    rc = pPager->n
c110: 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f  oLock ? SQLITE_O
c120: 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  K : sqlite3OsLoc
c130: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
c140: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ock);.    if( rc
c150: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
c160: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
c170: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f  NKNOWN_LOCK||eLo
c180: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
c190: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  CK) ){.      pPa
c1a0: 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38  ger->eLock = (u8
c1b0: 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f  )eLock;.      IO
c1c0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
c1d0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
c1e0: 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d  Lock)).    }.  }
c1f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c200: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c210: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
c220: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
c230: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
c240: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
c250: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
c260: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
c270: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
c280: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
c290: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
c2a0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
c2b0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c2c0: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
c2d0: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
c2e0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
c2f0: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
c300: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
c310: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
c320: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
c330: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
c340: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
c350: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
c360: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
c370: 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  * The optimizati
c380: 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79  on is also alway
c390: 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65  s enabled for te
c3a0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49  mporary files. I
c3b0: 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  t is.** an error
c3c0: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
c3d0: 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72  nction if pPager
c3e0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e   is opened on an
c3f0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
c400: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
c410: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
c420: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  n cannot be used
c430: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
c440: 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73   If it can be us
c450: 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ed,.** then the 
c460: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
c470: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
c480: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
c490: 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69  hen it.** contai
c4a0: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
c4b0: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
c4c0: 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   page..*/.#ifdef
c4d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
c4e0: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74  TOMIC_WRITE.stat
c4f0: 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65  ic int jrnlBuffe
c500: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
c510: 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
c520: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
c530: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
c540: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b  e ){.    int dc;
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
c570: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
c580: 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tics */.    int 
c590: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nSector;        
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5b0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
c5c0: 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20      int szPage; 
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5e0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
c5f0: 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ze */..    asser
c600: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
c610: 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20  ->fd) );.    dc 
c620: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
c630: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
c640: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
c650: 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67    nSector = pPag
c660: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
c670: 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61      szPage = pPa
c680: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
c690: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
c6a0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
c6b0: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
c6c0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
c6d0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
c6e0: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
c6f0: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
c700: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c710: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
c720: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
c730: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
c740: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
c750: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
c760: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c770: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
c780: 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69  pPager);.}.#endi
c790: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  f../*.** If SQLI
c7a0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69  TE_CHECK_PAGES i
c7b0: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77  s defined then w
c7c0: 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79  e do some sanity
c7d0: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20   checking.** on 
c7e0: 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20  the cache using 
c7f0: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e  a hash function.
c800: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
c810: 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e  or testing.** an
c820: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
c830: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
c840: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
c850: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
c860: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
c870: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
c880: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
c890: 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61  u32 pager_dataha
c8a0: 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e  sh(int nByte, un
c8b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
c8c0: 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20  ta){.  u32 hash 
c8d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
c8e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65  for(i=0; i<nByte
c8f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68  ; i++){.    hash
c900: 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b   = (hash*1039) +
c910: 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20   pData[i];.  }. 
c920: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
c930: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c940: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c950: 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
c960: 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  n pager_datahash
c970: 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  (pPage->pPager->
c980: 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67  pageSize, (unsig
c990: 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65  ned char *)pPage
c9a0: 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74  ->pData);.}.stat
c9b0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65  ic void pager_se
c9c0: 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  t_pagehash(PgHdr
c9d0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67   *pPage){.  pPag
c9e0: 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  e->pageHash = pa
c9f0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61  ger_pagehash(pPa
ca00: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ge);.}../*.** Th
ca10: 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63  e CHECK_PAGE mac
ca20: 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72  ro takes a PgHdr
ca30: 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
ca40: 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  . If SQLITE_CHEC
ca50: 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65  K_PAGES.** is de
ca60: 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55  fined, and NDEBU
ca70: 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
ca80: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  , an assert() st
ca90: 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a  atement checks.*
caa0: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
cab0: 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20  is either dirty 
cac0: 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73  or still matches
cad0: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20   the calculated 
cae0: 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64  page-hash..*/.#d
caf0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
cb00: 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29  (x) checkPage(x)
cb10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
cb20: 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  ckPage(PgHdr *pP
cb30: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
cb40: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
cb50: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  r;.  assert( pPa
cb60: 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
cb70: 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
cb80: 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
cb90: 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c  s&PGHDR_DIRTY) |
cba0: 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d  | pPg->pageHash=
cbb0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
cbc0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
cbd0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64  .#define pager_d
cbe0: 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a  atahash(X,Y)  0.
cbf0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61  #define pager_pa
cc00: 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65  gehash(X)  0.#de
cc10: 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70  fine pager_set_p
cc20: 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69  agehash(X).#defi
cc30: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
cc40: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
cc50: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
cc60: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
cc70: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
cc80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
cc90: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
cca0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
ccb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
ccc0: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
ccd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cce0: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
ccf0: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
cd00: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
cd10: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
cd20: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
cd30: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
cd40: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
cd50: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
cd60: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
cd70: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
cd80: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
cd90: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
cda0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cdb0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
cdc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
cdd0: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
cde0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
cdf0: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
ce00: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
ce10: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
ce20: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
ce30: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
ce40: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
ce50: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
ce60: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
ce70: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
ce80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ce90: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
cea0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
ceb0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
cec0: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
ced0: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
cee0: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
cef0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cf00: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
cf10: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
cf20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cf30: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
cf40: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
cf50: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
cf60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cf70: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
cf80: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
cf90: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
cfa0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
cfb0: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
cfc0: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
cfd0: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
cfe0: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
cff0: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
d000: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
d010: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
d020: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
d030: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
d040: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
d050: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
d060: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d070: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
d080: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
d090: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
d0a0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
d0b0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
d0c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
d0d0: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
d0e0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
d0f0: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
d100: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
d110: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
d120: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
d130: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
d140: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
d150: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
d160: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
d170: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
d180: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
d190: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
d1a0: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
d1b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
d1c0: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
d1d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
d1e0: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
d210: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
d220: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
d230: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d250: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
d260: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
d270: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
d280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d290: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
d2a0: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
d2b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d2c0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
d2d0: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
d2e0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
d2f0: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
d300: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
d310: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
d320: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
d330: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
d340: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
d350: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d360: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
d370: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
d380: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
d390: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
d3a0: 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c  || len==0 .   ||
d3b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d3c0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
d3d0: 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73  nl, szJ-12, &cks
d3e0: 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  um)).   || SQLIT
d3f0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d400: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
d410: 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d   aMagic, 8, szJ-
d420: 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70  8)).   || memcmp
d430: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
d440: 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c  lMagic, 8).   ||
d450: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d460: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d470: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
d480: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
d490: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
d4a0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
d4b0: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
d4c0: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
d4d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
d4e0: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30  ame */.  for(u=0
d4f0: 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20  ; u<len; u++){. 
d500: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73     cksum -= zMas
d510: 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66  ter[u];.  }.  if
d520: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
d530: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
d540: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
d550: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
d560: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
d570: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
d580: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
d590: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d5a0: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
d5b0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
d5c0: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
d5d0: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
d5e0: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
d5f0: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
d600: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
d610: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
d620: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
d630: 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20    len = 0;.  }. 
d640: 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20   zMaster[len] = 
d650: 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75  '\0';.   .  retu
d660: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d670: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d680: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
d690: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
d6a0: 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  at or immediatel
d6b0: 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  y .** following 
d6c0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61  the value in pPa
d6d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
d6e0: 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74   assuming a sect
d6f0: 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70  or .** size of p
d700: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
d710: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69  e bytes..**.** i
d720: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
d730: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
d740: 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e  **   Pager.journ
d750: 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52  alOff          R
d760: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20  eturn value.**  
d770: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
d780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d790: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35          0.**   5
d7c0: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
d7d0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d7e0: 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20    100           
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
d800: 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20  **   2000       
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
d820: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
d830: 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72  c i64 journalHdr
d840: 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50  Offset(Pager *pP
d850: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
d860: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
d870: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
d880: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
d890: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
d8a0: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
d8b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
d8c0: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
d8d0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
d8e0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d8f0: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
d900: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
d910: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
d920: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
d930: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
d940: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d950: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66   );.  return off
d960: 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  set;.}../*.** Th
d970: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
d980: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
d990: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d9a0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
d9b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d9c0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
d9d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
d9e0: 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65   not been writte
d9f0: 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74  n to.** within t
da00: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
da10: 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20  action (i.e. if 
da20: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
da30: 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  ==0)..**.** If d
da40: 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e  oTruncate is non
da50: 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67  -zero or the Pag
da60: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
da70: 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a  mit variable is.
da80: 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65  ** set to 0, the
da90: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  n truncate the j
daa0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a  ournal file to z
dab0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
dac0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  e. Otherwise,.**
dad0: 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74   zero the 28-byt
dae0: 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20  e header at the 
daf0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
db00: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69  rnal file. In ei
db10: 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69  ther case, .** i
db20: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
db30: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
db40: 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
db50: 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69  rnal file immedi
db60: 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20  ately .** after 
db70: 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  writing or trunc
db80: 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ating it..**.** 
db90: 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  If Pager.journal
dba0: 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74  SizeLimit is set
dbb0: 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20   to a positive, 
dbc0: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
dbd0: 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  and.** following
dbe0: 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
dbf0: 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72  or zeroing descr
dc00: 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73  ibed above the s
dc10: 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a  ize of the .** j
dc20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
dc30: 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74  ytes is larger t
dc40: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
dc50: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
dc60: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
dc70: 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e  e to Pager.journ
dc80: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65  alSizeLimit byte
dc90: 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  s. The journal f
dca0: 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
dcb0: 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65  need to be synce
dcc0: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  d following this
dcd0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
dce0: 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
dcf0: 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e   occurs, abandon
dd00: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
dd10: 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72  return the IO er
dd20: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68  ror code..** Oth
dd30: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53  erwise, return S
dd40: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
dd50: 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72  tic int zeroJour
dd60: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
dd70: 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e  ager, int doTrun
dd80: 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  cate){.  int rc 
dd90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ddc0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61  turn code */.  a
ddd0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
dde0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
ddf0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
de00: 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f  nalOff ){.    co
de10: 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d  nst i64 iLimit =
de20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de30: 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a  SizeLimit;    /*
de40: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
de50: 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52  jsl */..    IOTR
de60: 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25  ACE(("JZEROHDR %
de70: 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
de80: 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74     if( doTruncat
de90: 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29  e || iLimit==0 )
dea0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
deb0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
dec0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
ded0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dee0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
def0: 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d  ar zeroHdr[28] =
df00: 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d   {0};.      rc =
df10: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
df20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72  pPager->jfd, zer
df30: 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72  oHdr, sizeof(zer
df40: 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d  oHdr), 0);.    }
df50: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
df60: 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65  ITE_OK && !pPage
df70: 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
df80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
df90: 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
dfa0: 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  d, SQLITE_SYNC_D
dfb0: 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e  ATAONLY|pPager->
dfc0: 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
dfd0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
dfe0: 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e  s point the tran
dff0: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
e000: 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69  tted but the wri
e010: 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  te lock .    ** 
e020: 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
e030: 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
e040: 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69  ere is a size li
e050: 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66  mit configured f
e060: 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  or .    ** the p
e070: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
e080: 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  l and the journa
e090: 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
e0a0: 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20   consumes more. 
e0b0: 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e     ** space than
e0c0: 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f   that limit allo
e0d0: 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65  ws for, truncate
e0e0: 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69   it now. There i
e0f0: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a  s no need.    **
e100: 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c   to sync the fil
e110: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  e following this
e120: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
e130: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
e140: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d  QLITE_OK && iLim
e150: 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36  it>0 ){.      i6
e160: 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d  4 sz;.      rc =
e170: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
e180: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
e190: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
e1a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e1b0: 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   sz>iLimit ){.  
e1c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e1d0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
e1e0: 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74  ger->jfd, iLimit
e1f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
e220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e230: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
e240: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e250: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
e260: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
e270: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
e280: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
e290: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e2a0: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
e2b0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
e2c0: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
e2d0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
e2e0: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
e2f0: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
e300: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
e310: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
e320: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
e330: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
e340: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
e350: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
e360: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
e370: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
e380: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
e390: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
e3a0: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
e3b0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
e3c0: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
e3d0: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
e3e0: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
e3f0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
e400: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
e410: 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62  - 4 bytes: Datab
e420: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  ase page size..*
e430: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
e440: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
e450: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66  Z - 28) bytes of
e460: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
e470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
e480: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
e490: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
e4a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e4b0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
e4c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
e4d0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65  e */.  char *zHe
e4e0: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
e4f0: 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65  TmpSpace;  /* Te
e500: 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73  mporary space us
e510: 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64  ed to build head
e520: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61  er */.  u32 nHea
e530: 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65  der = (u32)pPage
e540: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53  r->pageSize;/* S
e550: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f  ize of buffer po
e560: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61  inted to by zHea
e570: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72  der */.  u32 nWr
e580: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e5a0: 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20  Bytes of header 
e5b0: 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a  sector written *
e5c0: 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e5f0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
e600: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e610: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
e620: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
e630: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
e640: 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  */..  if( nHeade
e650: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
e660: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e670: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
e680: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
e690: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
e6a0: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
e6b0: 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61  savepoints and a
e6c0: 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20  ny of them were 
e6d0: 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69  created .  ** si
e6e0: 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  nce the most rec
e6f0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ent journal head
e700: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20  er was written, 
e710: 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a  update the .  **
e720: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
e730: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
e740: 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s now..  */.  fo
e750: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
e760: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
e770: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
e780: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
e790: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d  [ii].iHdrOffset=
e7a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
e7b0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
e7c0: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20  i].iHdrOffset = 
e7d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e7e0: 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
e7f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e800: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
e810: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
e820: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
e830: 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  er);..  /* .  **
e840: 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
e850: 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62  Field - the numb
e860: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
e870: 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74  ds that follow t
e880: 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  his.  ** journal
e890: 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c   header. Normall
e8a0: 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74  y, zero is writt
e8b0: 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  en to this value
e8c0: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20   at this time.. 
e8d0: 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65   ** After the re
e8e0: 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20  cords are added 
e8f0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28  to the journal (
e900: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
e910: 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66  synced, .  ** if
e920: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
e930: 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73  de), the zero is
e940: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
e950: 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65  h the true numbe
e960: 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64  r.  ** of record
e970: 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e  s (see syncJourn
e980: 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  al())..  **.  **
e990: 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e   A faster altern
e9a0: 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74  ative is to writ
e9b0: 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20  e 0xFFFFFFFF to 
e9c0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20  the nRec field. 
e9d0: 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e  When.  ** readin
e9e0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  g the journal th
e9f0: 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53  is value tells S
ea00: 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20  QLite to assume 
ea10: 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65  that the.  ** re
ea20: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
ea30: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
ea40: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
ea50: 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74  ds. This assumpt
ea60: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67  ion.  ** is dang
ea70: 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66  erous, as if a f
ea80: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
ea90: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
eaa0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
eab0: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
eac0: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
ead0: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
eae0: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
eaf0: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
eb00: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
eb10: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
eb20: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
eb30: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
eb40: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
eb50: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
eb60: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
eb70: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
eb80: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
eb90: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
eba0: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
ebb0: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
ebc0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
ebd0: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
ebe0: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
ebf0: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
ec00: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
ec10: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
ec20: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
ec30: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
ec40: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
ec50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
ec60: 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65  noSync || (pPage
ec70: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
ec80: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ec90: 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20  E_MEMORY).   || 
eca0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
ecb0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ecc0: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
ecd0: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
ece0: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
ecf0: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
ed00: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
ed10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ed20: 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32  gic));.    put32
ed30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ed40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ed50: 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66  ic)], 0xffffffff
ed60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ed70: 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20  memset(zHeader, 
ed80: 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  0, sizeof(aJourn
ed90: 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d  alMagic)+4);.  }
eda0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
edb0: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
edc0: 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73  tializer */ .  s
edd0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
ede0: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
edf0: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
ee00: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ee10: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
ee20: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ee30: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
ee40: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
ee50: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
ee60: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
ee70: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
ee80: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
ee90: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eea0: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
eeb0: 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  OrigSize);.  /* 
eec0: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
eed0: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
eee0: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
eef0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
ef00: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ef10: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
ef20: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
ef30: 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ..  /* The page 
ef40: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
ef50: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ef60: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ef70: 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+16], pPager->
ef80: 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  pageSize);..  /*
ef90: 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   Initializing th
efa0: 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75  e tail of the bu
efb0: 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65  ffer is not nece
efc0: 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69  ssary.  Everythi
efd0: 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69  ng.  ** works fi
efe0: 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nd if the follow
eff0: 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20  ing memset() is 
f000: 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e  omitted.  But in
f010: 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20  itializing.  ** 
f020: 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65  the memory preve
f030: 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  nts valgrind fro
f040: 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73  m complaining, s
f050: 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67  o we are willing
f060: 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68   to.  ** take th
f070: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  e performance hi
f080: 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  t..  */.  memset
f090: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f0a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f0b0: 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  20], 0,.        
f0c0: 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66   nHeader-(sizeof
f0d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f0e0: 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74  20));..  /* In t
f0f0: 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c  heory, it is onl
f100: 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  y necessary to w
f110: 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65  rite the 28 byte
f120: 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a  s that the .  **
f130: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f140: 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20  consumes to the 
f150: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
f160: 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e  e. Then incremen
f170: 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  t the .  ** Page
f180: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72  r.journalOff var
f190: 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c  iable by JOURNAL
f1a0: 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20  _HDR_SZ so that 
f1b0: 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72  the next .  ** r
f1c0: 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e  ecord is written
f1d0: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
f1e0: 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e  g sector (leavin
f1f0: 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66  g a gap in the f
f200: 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69  ile.  ** that wi
f210: 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79  ll be implicitly
f220: 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68   filled in by th
f230: 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  e OS)..  **.  **
f240: 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20   However it has 
f250: 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20  been discovered 
f260: 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73  that on some sys
f270: 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72  tems this patter
f280: 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73  n can .  ** be s
f290: 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f  ignificantly slo
f2a0: 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75  wer than contigu
f2b0: 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61  ously writing da
f2c0: 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a  ta to the file,.
f2d0: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61    ** even if tha
f2e0: 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74  t means explicit
f2f0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f300: 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  to the block of 
f310: 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  .  ** (JOURNAL_H
f320: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
f330: 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20  s that will not 
f340: 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74  be used. So that
f350: 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73   is what.  ** is
f360: 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a   done. .  **.  *
f370: 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65  * The loop is re
f380: 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63  quired here in c
f390: 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73  ase the sector-s
f3a0: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
f3b0: 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  an the .  ** dat
f3c0: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
f3d0: 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64   Since the zHead
f3e0: 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c  er buffer is onl
f3f0: 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  y Pager.pageSize
f400: 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
f410: 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ize, more than o
f420: 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ne call to sqlit
f430: 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20  e3OsWrite() may 
f440: 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a  be required.  **
f450: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
f460: 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
f470: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
f480: 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74   */ .  for(nWrit
f490: 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e=0; rc==SQLITE_
f4a0: 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e  OK&&nWrite<JOURN
f4b0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
f4c0: 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64  ); nWrite+=nHead
f4d0: 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  er){.    IOTRACE
f4e0: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
f4f0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
f500: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f510: 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20  r, nHeader)).   
f520: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
f530: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
f540: 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64  , zHeader, nHead
f550: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
f560: 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73  nalOff);.    ass
f570: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
f580: 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
f590: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
f5a0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
f5b0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64  rnalOff += nHead
f5c0: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
f5d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
f5e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f5f0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
f600: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
f610: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
f620: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
f630: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
f640: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
f650: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f660: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f670: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20  al.** file. The 
f680: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f690: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
f6a0: 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
f6b0: 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  .** pPager->jour
f6c0: 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d  nalOff. See comm
f6d0: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
f6e0: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
f6f0: 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64  Hdr() for.** a d
f700: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
f710: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f720: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
f730: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
f740: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
f750: 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74  y, *pNRec is set
f760: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
f770: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
f780: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
f790: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62   header and *pDb
f7a0: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
f7b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
f7c0: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
f7d0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
f7e0: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
f7f0: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
f800: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
f810: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
f820: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f830: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
f840: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
f850: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
f860: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
f870: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f880: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
f890: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
f8a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
f8b0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
f8c0: 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53  *pNRec and *PDbS
f8d0: 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65  ize are undefine
f8e0: 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  d.  If JOURNAL_H
f8f0: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
f900: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
f910: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
f920: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
f930: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
f940: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
f950: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
f960: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
f970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f980: 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
f990: 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36   int isHot,.  i6
f9a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20  4 journalSize,  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
f9c0: 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  ze of the open j
f9d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
f9e0: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ytes */.  u32 *p
f9f0: 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20  NRec,           
fa00: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
fa10: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
fa20: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f  he nRec field */
fa30: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20  .  u32 *pDbSize 
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66  /* OUT: Value of
fa60: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
fa70: 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f  se size field */
fa80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
fab0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
fac0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
fad0: 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20      /* A buffer 
fae0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
faf0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
fb00: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
fb10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
fb20: 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  fset of journal 
fb30: 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61  header being rea
fb40: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
fb50: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
fb60: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
fb70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
fb80: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
fb90: 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72  /* Advance Pager
fba0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74  .journalOff to t
fbb0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
fbc0: 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20  next sector. If 
fbd0: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
fbe0: 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61   file is too sma
fbf0: 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  ll for there to 
fc00: 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72  be a header stor
fc10: 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ed at this.  ** 
fc20: 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51  point, return SQ
fc30: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a  LITE_DONE..  */.
fc40: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fc50: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
fc60: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
fc70: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
fc80: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
fc90: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
fca0: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
fcb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fcc0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
fcd0: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
fce0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
fcf0: 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
fd00: 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
fd10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
fd20: 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20  der. If they do 
fd30: 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74  not match.  ** t
fd40: 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67  he  magic string
fd50: 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74   found at the st
fd60: 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72  art of each jour
fd70: 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75  nal header, retu
fd80: 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  rn.  ** SQLITE_D
fd90: 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ONE. If an IO er
fda0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
fdb0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
fdc0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a  . Otherwise,.  *
fdd0: 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  * proceed..  */.
fde0: 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69    if( isHot || i
fdf0: 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e  HdrOff!=pPager->
fe00: 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20  journalHdr ){.  
fe10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
fe20: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
fe30: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
fe40: 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66  (aMagic), iHdrOf
fe50: 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  f);.    if( rc )
fe60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
fe70: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
fe80: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
fe90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
fea0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
feb0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
fec0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
fed0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
fee0: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68  ead the first th
fef0: 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64  ree 32-bit field
ff00: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
ff10: 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65   header: The nRe
ff20: 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68  c.  ** field, th
ff30: 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69  e checksum-initi
ff40: 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64  alizer and the d
ff50: 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20  atabase size at 
ff60: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
ff70: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
ff80: 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  n. Return an err
ff90: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
ffa0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
ffb0: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
ffc0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
ffd0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
ffe0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70  fd, iHdrOff+8, p
fff0: 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c  NRec)).   || SQL
10000 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10010 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10020 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32  >jfd, iHdrOff+12
10030 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
10040 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Init)).   || SQL
10050 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10060 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10070 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36  >jfd, iHdrOff+16
10080 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b  , pDbSize)).  ){
10090 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
100a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
100b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
100c0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67   ){.    u32 iPag
100d0 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
100e0 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a       /* Page-siz
100f0 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
10100 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
10110 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65   u32 iSectorSize
10120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10130 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   Sector-size fie
10140 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
10150 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ader */..    /* 
10160 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69  Read the page-si
10170 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
10180 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ze journal heade
10190 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20  r fields. */.   
101a0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
101b0 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
101c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
101d0 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74  drOff+20, &iSect
101e0 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c  orSize)).     ||
101f0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10200 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10210 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10220 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65  f+24, &iPageSize
10230 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
10240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10250 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e  ..    /* Version
10260 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
10270 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74  r to 3.5.8 set t
10280 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65  he page-size fie
10290 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ld of the.    **
102a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
102b0 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
102c0 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68   case, assume th
102d0 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67  at the Pager.pag
102e0 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72  eSize.    ** var
102f0 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79  iable is already
10300 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72   set to the corr
10310 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20  ect page size.. 
10320 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
10330 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  ageSize==0 ){.  
10340 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20      iPageSize = 
10350 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10370 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  Check that the v
10380 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20  alues read from 
10390 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
103a0 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  d sector-size fi
103b0 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  elds.    ** are 
103c0 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f  within range. To
103d0 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20   be 'in range', 
103e0 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64  both values need
103f0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20   to be a power. 
10400 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65     ** of two gre
10410 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
10420 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c  al to 512 or 32,
10430 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72   and not greater
10440 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20   than their .   
10450 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63   ** respective c
10460 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69  ompile time maxi
10470 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20  mum limits..    
10480 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10490 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20  Size<512        
104a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65            || iSe
104b0 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20  ctorSize<32.    
104c0 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51   || iPageSize>SQ
104d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
104e0 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a  ZE || iSectorSiz
104f0 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
10500 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67  E.     || ((iPag
10510 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
10520 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53  ze)!=0   || ((iS
10530 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65  ectorSize-1)&iSe
10540 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20  ctorSize)!=0 .  
10550 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66    ){.      /* If
10560 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20   the either the 
10570 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63  page-size or sec
10580 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  tor-size in the 
10590 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
105a0 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61  s .      ** inva
105b0 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72  lid, then the pr
105c0 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
105d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
105e0 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20  der must have . 
105f0 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20       ** crashed 
10600 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65  before the heade
10610 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e  r was synced. In
10620 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20   this case stop 
10630 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  reading .      *
10640 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
10650 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  le here..      *
10660 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
10670 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
10680 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
10690 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74   the page-size t
106a0 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
106b0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
106c0 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a  journal. .    **
106d0 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28   Use a testcase(
106e0 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20  ) macro to make 
106f0 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  sure that malloc
10700 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20   failure within 
10710 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74  .    ** PagerSet
10720 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65  Pagesize() is te
10730 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sted..    */.   
10740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10750 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
10760 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
10770 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
10780 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
10790 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  OK );..    /* Up
107a0 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
107b0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
107c0 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
107d0 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20  used by .    ** 
107e0 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
107f0 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
10800 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
10810 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a  ournal was.    *
10820 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
10830 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
10840 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
10850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
10860 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
10870 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
10880 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
10890 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
108a0 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67  ue.    ** of Pag
108b0 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
108c0 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
108d0 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
108e0 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tine..    */.   
108f0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
10900 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a  ize = iSectorSiz
10910 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  e;.  }..  pPager
10920 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
10930 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10940 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
10950 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
10960 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
10970 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
10980 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
10990 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
109a0 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
109b0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
109c0 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
109d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
109e0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
109f0 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
10a00 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
10a10 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
10a20 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
10a30 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
10a40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
10a50 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
10a60 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
10a70 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
10a80 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
10a90 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
10aa0 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
10ab0 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10ac0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
10ad0 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20  **   + N bytes: 
10ae0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  Master journal f
10af0 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38  ilename in utf-8
10b00 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10b10 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d  : N (length of m
10b20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10b30 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20  me in bytes, no 
10b40 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e  nul-terminator).
10b50 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10b60 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10b70 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
10b80 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61  *   + 8 bytes: a
10b90 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
10ba0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
10bb0 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
10bc0 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
10bd0 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
10be0 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
10bf0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68  journal name, wh
10c00 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73  ere each byte is
10c10 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
10c20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69  a signed 8-bit i
10c30 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  nteger..**.** If
10c40 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
10c50 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
10c60 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
10c70 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
10c80 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
10c90 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
10ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10cb0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
10cc0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
10cd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
10ce0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10d10 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
10d20 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20  t nMaster;      
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d40 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69  * Length of stri
10d50 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  ng zMaster */.  
10d60 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
10d90 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  ader in journal 
10da0 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72  file */.  i64 jr
10db0 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  nlSize;         
10dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10dd0 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ze of journal fi
10de0 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20  le on disk */.  
10df0 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20  u32 cksum = 0;  
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20   /* Checksum of 
10e20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
10e30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
10e40 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
10e50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
10e60 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
10e70 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a  er) );..  if( !z
10e80 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50  Master .   || pP
10e90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
10ea0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
10eb0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
10ec0 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
10ed0 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20  r->jfd).  ){.   
10ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ef0 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
10f00 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
10f10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10f20 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
10f30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10f40 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63  ff );..  /* Calc
10f50 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68  ulate the length
10f60 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68   in bytes and th
10f70 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d  e checksum of zM
10f80 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e  aster */.  for(n
10f90 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65  Master=0; zMaste
10fa0 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73  r[nMaster]; nMas
10fb0 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ter++){.    cksu
10fc0 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  m += zMaster[nMa
10fd0 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster];.  }..  /*
10fe0 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
10ff0 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74   mode, advance t
11000 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20  o the next disk 
11010 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72  sector before wr
11020 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  iting.  ** the m
11030 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
11040 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63  me. This is in c
11050 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
11060 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f   page written to
11070 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
11080 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  l has already be
11090 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a  en synced..  */.
110a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
110b0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
110c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
110d0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
110e0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
110f0 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
11100 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
11110 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
11120 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11130 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20  data to the end 
11140 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
11150 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ile. If.  ** an 
11160 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
11170 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
11180 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
11190 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30  r..  */.  if( (0
111a0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
111b0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
111c0 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45  d, iHdrOff, PAGE
111d0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
111e0 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  )))).   || (0 !=
111f0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
11200 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
11210 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73  d, zMaster, nMas
11220 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29  ter, iHdrOff+4))
11230 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
11240 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11250 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11260 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20  rOff+4+nMaster, 
11270 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c  nMaster))).   ||
11280 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
11290 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
112a0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
112b0 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d  nMaster+4, cksum
112c0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
112d0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
112e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
112f0 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
11300 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d   8, iHdrOff+4+nM
11310 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
11320 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11330 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
11340 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
11350 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
11360 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11370 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11380 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11390 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
113a0 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
113b0 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
113c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
113d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
113e0 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
113f0 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
11400 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
11410 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
11420 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
11430 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
11440 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
11450 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
11460 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11470 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11480 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11490 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
114a0 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
114b0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
114c0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
114d0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
114e0 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
114f0 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
11500 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
11510 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
11520 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
11530 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
11540 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11550 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
11560 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11570 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11580 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11590 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
115a0 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
115b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
115c0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
115d0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
115e0 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
115f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11600 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
11610 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11620 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11630 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11640 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11650 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11660 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61  er){.  sqlite3Ba
11670 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
11680 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
11690 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
116a0 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
116b0 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  he);.}../*.** Fr
116c0 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
116d0 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
116e0 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
116f0 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11700 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11710 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
11720 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
11730 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11740 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
11750 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
11760 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11770 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11780 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11790 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
117a0 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
117b0 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
117c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
117d0 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
117e0 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
117f0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11800 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11810 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11820 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
11830 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11840 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
11850 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
11860 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11870 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11880 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11890 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
118a0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
118b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
118c0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
118d0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
118e0 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
118f0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
11900 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11910 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11920 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
11930 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
11940 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
11950 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
11960 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
11970 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
11980 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
11990 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
119a0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
119b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
119c0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
119d0 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
119e0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
119f0 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
11a00 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
11a10 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
11a20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11a30 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
11a40 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11a50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11a60 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11a80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11a90 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
11aa0 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11ab0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11ac0 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11ad0 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11ae0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11af0 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
11b00 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
11b10 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
11b20 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
11b30 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
11b40 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
11b50 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
11b60 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
11b70 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
11b80 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
11b90 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
11ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11bc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11bd0 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11be0 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11bf0 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
11c00 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11c10 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
11c20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
11c30 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
11c40 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
11c50 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11c60 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11c70 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
11c80 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
11c90 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
11ca0 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11cb0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11cc0 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11cd0 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
11ce0 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
11cf0 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
11d00 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
11d10 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
11d20 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
11d30 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
11d50 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
11d60 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
11d70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11d80 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
11d90 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
11da0 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11db0 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11dc0 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11dd0 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
11de0 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
11df0 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
11e00 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11e10 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
11e20 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
11e30 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11e40 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
11e50 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
11e60 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
11e70 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
11e80 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
11e90 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
11ea0 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11eb0 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11ec0 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11ed0 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11ee0 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11ef0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11f00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11f10 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11f20 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11f30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11f40 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
11f50 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
11f60 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11f70 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
11f80 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11f90 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
11fa0 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11fb0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11fc0 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11fd0 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11fe0 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11ff0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
12000 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
12010 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
12020 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
12030 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
12040 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
12050 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
12060 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12070 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
12080 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
12090 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
120a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
120c0 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
120d0 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
120e0 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
120f0 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
12100 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
12110 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
12120 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
12130 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
12140 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
12150 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
12160 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
12170 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
12180 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
12190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
121a0 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
121b0 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
121c0 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
121d0 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
121e0 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
121f0 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
12200 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
12210 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
12220 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
12230 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
12240 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12250 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
12260 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12270 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12280 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
12290 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
122a0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
122b0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
122c0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
122d0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
122e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
122f0 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
12300 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12310 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
12320 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
12330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12340 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12350 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
12360 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
12370 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
12380 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
12390 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
123a0 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
123b0 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
123c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
123d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
123e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
123f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
12400 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
12410 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
12420 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
12430 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
12440 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
12450 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
12460 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
12470 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
12480 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
12490 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
124a0 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
124b0 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
124c0 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
124d0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
124e0 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
124f0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
12500 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
12510 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
12520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
12530 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
12540 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
12550 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
12560 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
12570 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12580 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
12590 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
125a0 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
125b0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
125c0 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
125d0 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
125e0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
125f0 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
12600 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
12610 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
12620 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
12630 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
12640 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
12650 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12660 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12670 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
12680 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
12690 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
126a0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
126b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
126c0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
126d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
126e0 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
126f0 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
12700 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
12710 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
12720 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
12730 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
12740 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
12750 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12760 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
12770 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
12780 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
12790 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
127a0 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
127b0 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
127c0 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
127d0 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
127e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
127f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12800 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
12810 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12820 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12830 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12840 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
12850 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
12860 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12870 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
12880 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
12890 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 55 53 45  _OK;.    if( USE
128a0 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
128b0 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
128c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
128d0 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  0);.  }..  pPage
128e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
128f0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
12900 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
12910 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
12920 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
12930 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12940 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
12950 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
12960 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
12970 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
12980 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
12990 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
129a0 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
129b0 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
129c0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
129d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
129e0 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
129f0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
12a00 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
12a10 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
12a20 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
12a30 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
12a40 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
12a50 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
12a60 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
12a70 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
12a80 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
12a90 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
12aa0 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
12ab0 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
12ac0 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
12ad0 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
12ae0 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
12af0 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
12b00 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
12b10 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
12b20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
12b30 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
12b40 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
12b50 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12b60 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
12b70 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
12b80 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
12b90 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
12ba0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
12bb0 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
12bc0 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
12bd0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
12be0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12bf0 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
12c00 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
12c10 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
12c20 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
12c30 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
12c40 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
12c50 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12c60 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
12c70 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
12c80 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
12c90 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
12ca0 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
12cb0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12cc0 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
12cd0 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
12ce0 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
12cf0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
12d00 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
12d10 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
12d20 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
12d30 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
12d40 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
12d50 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
12d60 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
12d70 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
12d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12d90 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
12da0 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
12db0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12dc0 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
12dd0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
12df0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
12e00 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
12e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
12e20 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
12e30 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
12e40 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
12e50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12e60 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
12e70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12e80 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d  PAGER_ERROR;.  }
12e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12ea0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12eb0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12ec0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12ed0 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
12ee0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
12ef0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
12f00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12f10 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
12f20 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
12f30 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
12f40 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
12f50 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
12f60 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
12f70 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
12f80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
12f90 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
12fa0 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
12fb0 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
12fc0 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
12fd0 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
12fe0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
12ff0 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
13000 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
13010 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13020 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
13030 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
13040 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20  state. If it is 
13050 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47  called.** in PAG
13060 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52  ER_NONE or PAGER
13070 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e  _SHARED state an
13080 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  d the lock held 
13090 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75  is less.** exclu
130a0 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45  sive than a RESE
130b0 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73  RVED lock, it is
130c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
130d0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
130e0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
130f0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
13100 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
13110 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
13120 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
13130 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
13140 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
13150 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
13160 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
13170 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
13180 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
13190 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
131a0 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
131b0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
131c0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
131d0 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
131e0 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
131f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
13200 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
13210 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
13220 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
13230 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
13240 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
13250 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
13260 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
13270 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
13280 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
13290 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
132a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
132b0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
132c0 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
132d0 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
132e0 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
132f0 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
13300 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
13310 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
13320 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
13330 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
13340 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
13350 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
13360 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
13370 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
13380 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13390 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
133a0 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
133b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
133c0 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
133d0 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
133e0 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
133f0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
13400 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
13410 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
13420 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
13430 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
13440 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
13450 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
13460 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
13470 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
13480 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
13490 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
134a0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
134b0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
134c0 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
134d0 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
134e0 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
134f0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13500 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
13510 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
13520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13530 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
13540 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
13550 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
13560 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
13570 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
13580 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13590 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
135a0 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
135b0 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
135c0 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
135d0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
135e0 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
135f0 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
13600 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  the pager moves 
13610 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
13620 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e  state..** If run
13630 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
13640 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  usive rollback m
13650 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ode, the lock on
13660 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a   the file is .**
13670 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
13680 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13690 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
136a0 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
136b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
136c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
136d0 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
136e0 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
136f0 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
13700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13710 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
13720 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
13730 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
13740 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
13750 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
13760 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
13770 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
13780 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
13790 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
137a0 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
137b0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
137c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
137d0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
137e0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
137f0 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13800 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
13810 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
13820 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
13830 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
13840 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
13850 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
13860 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
13870 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
13880 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13890 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
138a0 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
138b0 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
138c0 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  ster, int bCommi
138d0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
138e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
138f0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13900 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
13910 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
13920 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
13930 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
13940 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13950 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
13960 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
13970 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
13980 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
13990 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
139a0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
139b0 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
139c0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
139d0 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
139e0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
139f0 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
13a00 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
13a10 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
13a20 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
13a30 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
13a40 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
13a50 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
13a60 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
13a70 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
13a80 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
13a90 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
13aa0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
13ab0 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
13ac0 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
13ad0 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
13ae0 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
13af0 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
13b00 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
13b10 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13b20 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
13b30 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
13b40 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
13b50 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
13b60 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
13b70 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
13b80 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
13b90 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
13ba0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13bb0 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
13bc0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
13bd0 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
13be0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13bf0 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
13c00 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
13c10 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
13c20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
13c30 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
13c40 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
13c50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
13c60 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
13c70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
13c80 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
13c90 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
13ca0 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
13cb0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
13cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13cd0 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
13ce0 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
13cf0 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
13d00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13d10 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
13d20 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
13d30 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
13d40 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13d50 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
13d60 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
13d70 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
13d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13d90 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
13da0 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
13db0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
13dc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13dd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13de0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13df0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
13e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13e10 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13e20 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
13e30 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13e40 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13e50 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
13e60 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
13e70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13e80 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
13e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13ea0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13eb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13ec0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
13ed0 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
13ee0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
13ef0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
13f00 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
13f10 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
13f20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c  sure the new fil
13f30 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74 65  e size is writte
13f40 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65  n into the inode
13f50 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
13f60 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
13f70 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ise the journal 
13f80 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74 20  might resurrect 
13f90 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
13fa0 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20  r loss and.     
13fb0 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
13fc0 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69  e last transacti
13fd0 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  on to roll back.
13fe0 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20 20    See.          
13ff0 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  ** https://bugzi
14000 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f  lla.mozilla.org/
14010 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
14020 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20  1072773.        
14030 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
14040 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
14050 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
14060 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
14070 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14080 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
14090 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
140a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
140b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
140c0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
140d0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
140e0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
140f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14100 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
14110 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
14120 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
14130 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
14140 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
14150 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
14160 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
14170 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
14180 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14190 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
141a0 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  h may be execute
141b0 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75  d with Pager.jou
141c0 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
141d0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68   if.      ** a h
141e0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a  ot-journal was j
141f0 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ust rolled back.
14200 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
14210 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
14220 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  ** file should b
14230 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  e closed and del
14240 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f  eted. If this co
14250 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
14260 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
14270 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
14280 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69  t will do so usi
14290 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ng an in-memory 
142a0 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20  journal. .      
142b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  */.      int bDe
142c0 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72 2d  lete = (!pPager-
142d0 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71 6c  >tempFile && sql
142e0 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74  ite3JournalExist
142f0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b  s(pPager->jfd));
14300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14310 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14320 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14330 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20  LMODE_DELETE .  
14340 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
14350 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14360 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14370 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20  DE_MEMORY .     
14380 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
14390 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
143a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
143b0 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
143c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
143d0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
143e0 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c 65  .      if( bDele
143f0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  te ){.        rc
14400 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
14410 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
14420 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
14430 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
14440 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
14450 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
14460 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61  GES.  sqlite3Pca
14470 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
14480 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14490 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
144a0 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ash);.  if( pPag
144b0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26  er->dbSize==0 &&
144c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
144d0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
144e0 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
144f0 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69   PgHdr *p = sqli
14500 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
14510 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69  Pager, 1);.    i
14520 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
14530 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20  >pageHash = 0;. 
14540 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14550 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29  rUnrefNotNull(p)
14560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14570 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
14580 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
14590 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
145a0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
145b0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
145c0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
145d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
145e0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
145f0 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
14600 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
14610 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14620 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
14630 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
14640 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
14650 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
14660 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
14670 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
14680 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14690 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
146a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
146b0 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
146c0 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
146d0 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
146e0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
146f0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
14700 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
14710 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14720 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
14730 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
14740 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
14750 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
14760 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
14770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14780 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14790 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
147a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
147b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
147c0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
147d0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
147e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
147f0 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
14800 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
14810 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14820 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
14830 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
14840 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
14850 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
14860 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
14870 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
14880 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
14890 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
148a0 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
148b0 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
148c0 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
148d0 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
148e0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
148f0 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
14900 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
14910 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
14920 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
14930 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
14940 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
14950 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
14960 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
14970 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
14980 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
14990 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
149a0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
149b0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d  LITE_OK && bComm
149c0 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  it && isOpen(pPa
149d0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
149e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
149f0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
14a00 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
14a10 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54  TL_COMMIT_PHASET
14a20 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  WO, 0);.    if( 
14a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
14a40 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UND ) rc = SQLIT
14a50 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
14a60 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
14a70 69 76 65 4d 6f 64 65 20 26 26 20 21 50 61 67 65  iveMode && !Page
14a80 72 4f 74 61 4d 6f 64 65 28 70 50 61 67 65 72 29  rOtaMode(pPager)
14a90 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
14aa0 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
14ab0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
14ac0 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
14ad0 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
14ae0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
14af0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
14b00 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
14b10 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
14b20 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
14b30 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
14b40 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
14b50 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
14b60 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
14b70 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
14b80 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
14b90 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
14ba0 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
14bb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
14bc0 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
14bd0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
14be0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
14bf0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
14c00 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
14c10 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
14c20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
14c30 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
14c40 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
14c50 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
14c60 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
14c70 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
14c80 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
14c90 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
14ca0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
14cb0 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
14cc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
14cd0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
14ce0 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
14cf0 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
14d00 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
14d10 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
14d20 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
14d30 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
14d40 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
14d50 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
14d60 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
14d70 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
14d80 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
14d90 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
14da0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
14db0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
14dc0 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
14dd0 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
14de0 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
14df0 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
14e00 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
14e10 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
14e20 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
14e30 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
14e40 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
14e50 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
14e60 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
14e70 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
14e80 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
14e90 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
14ea0 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
14eb0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
14ec0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
14ed0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14ee0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14ef0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
14f00 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
14f10 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
14f20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
14f30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
14f40 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
14f50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14f60 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
14f70 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
14f80 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
14f90 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14fa0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14fb0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
14fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14fd0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
14fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14ff0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
15000 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
15010 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15020 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
15030 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
15040 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
15050 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ion(pPager, 0, 0
15060 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
15070 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
15080 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  er);.}../*.** Pa
15090 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
150a0 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
150b0 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
150c0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
150d0 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
150e0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
150f0 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
15100 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
15110 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
15120 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
15130 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
15140 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15150 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
15160 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
15170 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
15180 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
15190 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
151a0 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
151b0 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
151c0 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
151d0 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
151e0 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
151f0 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
15200 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
15210 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
15220 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
15230 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
15240 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
15250 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
15260 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
15270 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
15280 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
15290 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
152a0 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
152b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
152c0 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
152d0 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
152e0 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
152f0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
15300 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
15310 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
15320 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
15330 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
15340 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
15350 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
15360 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
15370 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
15380 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
15390 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
153a0 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
153b0 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
153c0 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
153d0 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
153e0 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
153f0 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
15400 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
15410 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
15420 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
15430 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
15440 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
15450 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
15460 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
15470 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
15480 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
15490 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
154a0 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
154b0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
154c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
154d0 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
154e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
154f0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
15500 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
15510 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
15520 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
15530 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
15540 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
15550 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
15560 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
15570 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
15580 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
15590 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
155a0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
155b0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
155c0 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
155d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
155e0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
155f0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
15600 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
15610 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
15620 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
15630 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15650 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
15660 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
15670 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
15680 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15690 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
156a0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
156b0 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
156c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
156d0 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
156e0 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68  e from either th
156f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
15700 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31  if isMainJrnl==1
15710 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ) or.** from the
15720 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66   sub-journal (if
15730 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20   isMainJrnl==0) 
15740 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61  and playback tha
15750 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70  t page..** The p
15760 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66  age begins at of
15770 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e  fset *pOffset in
15780 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65  to the file. The
15790 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c   *pOffset.** val
157a0 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20  ue is increased 
157b0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
157c0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
157d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
157e0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  .** The main rol
157f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
15800 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  es checksums - t
15810 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
15820 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f  rnal does .** no
15830 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
15840 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
15850 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72  he page record r
15860 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15870 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
15880 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
15890 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
158a0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
158b0 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62  Size, then playb
158c0 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65  ack is.** skippe
158d0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
158e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
158f0 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e  ** If pDone is n
15900 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
15910 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20   is a record of 
15920 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  pages that have 
15930 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
15940 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66  played back.  If
15950 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f   the page at *pO
15960 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64  ffset has alread
15970 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
15980 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f  ck.** (if the co
15990 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e  rresponding pDon
159a0 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68  e bit is set) th
159b0 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79  en skip the play
159c0 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75  back..** Make su
159d0 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74  re the pDone bit
159e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
159f0 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70  o the *pOffset p
15a00 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72  age is set.** pr
15a10 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67  ior to returning
15a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
15a30 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75  age record is su
15a40 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
15a50 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15a60 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61  ournal file.** a
15a70 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20  nd played back, 
15a80 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
15a90 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
15aa0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
15ab0 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69  s.** while readi
15ac0 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72  ng the record fr
15ad0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15ae0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69  rnal file or whi
15af0 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f  le writing.** to
15b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15b10 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  le, then the IO 
15b20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
15b30 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a  turned. If data.
15b40 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ** is successful
15b50 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
15b60 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15b70 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20  ile but appears 
15b80 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74  to be.** corrupt
15b90 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
15ba0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74  is returned. Dat
15bb0 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  a is considered 
15bc0 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20  corrupted in.** 
15bd0 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
15be0 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66  s:.** .**   * If
15bf0 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65   the record page
15c00 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67  -number is illeg
15c10 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d  al (0 or PAGER_M
15c20 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20  J_PGNO), or.**  
15c30 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15c40 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
15c50 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
15c60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
15c70 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20  .**     and the 
15c80 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64  checksum field d
15c90 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
15ca0 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74  e record content
15cb0 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20  ..**.** Neither 
15cc0 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65  of these two sce
15cd0 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69  narios are possi
15ce0 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76  ble during a sav
15cf0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  epoint rollback.
15d00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
15d10 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  s a savepoint ro
15d20 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d  llback, then mem
15d30 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20  ory may have to 
15d40 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  be dynamically.*
15d50 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
15d60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  his function. If
15d70 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
15d80 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74  e and an allocat
15d90 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51  ion fails,.** SQ
15da0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
15db0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
15dc0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
15dd0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
15de0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e00 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e  * The pager bein
15e10 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  g played back */
15e20 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e40 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
15e50 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
15e60 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
15e70 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  one,            
15e80 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66      /* Bitvec of
15e90 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70   pages already p
15ea0 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
15eb0 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ed0 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
15ee0 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
15ef0 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
15f00 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20  sSavepnt        
15f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
15f20 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74   for a savepoint
15f30 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a   rollback */.){.
15f40 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
15f50 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
15f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
15f70 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
15f80 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
15f90 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15fb0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
15fc0 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
15fd0 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
15fe0 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
15ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
16000 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
16010 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
16020 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20  .  char *aData; 
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74   /* Temporary st
16050 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61  orage for the pa
16060 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ge */.  sqlite3_
16070 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
16080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
16090 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
160a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
160b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e  e */.  int isSyn
160c0 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ced;            
160d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
160e0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20  journal page is 
160f0 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73  synced */..  ass
16100 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
16110 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
16120 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
16130 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
16140 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
16150 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
16160 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
16170 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
16180 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
16190 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
161a0 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
161b0 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
161c0 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
161d0 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
161e0 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
161f0 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
16200 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
16210 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
16220 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
16230 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
16240 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
16250 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
16260 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
16270 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
16280 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
16290 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
162a0 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e  0 || (!isMainJrn
162b0 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20  l && isSavepnt) 
162c0 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20  );..  /* Either 
162d0 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65  the state is gre
162e0 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f  ater than PAGER_
162f0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
16300 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  (a transaction .
16310 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
16320 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20  t rollback done 
16330 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f  at the request o
16340 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72  f the caller) or
16350 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20   this is.  ** a 
16360 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16370 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61  back. If it is a
16380 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16390 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72  lback, the pager
163a0 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74  .  ** is in stat
163b0 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73  e OPEN and holds
163c0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
163d0 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ck. Hot-journal 
163e0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e  rollback.  ** on
163f0 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68  ly reads from th
16400 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  e main journal, 
16410 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  not the sub-jour
16420 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
16430 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
16440 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
16450 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
16460 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74   || (pPager->eSt
16470 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
16480 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
16490 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
164a0 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ).  );.  assert(
164b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
164c0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
164d0 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e  CHEMOD || isMain
164e0 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  Jrnl );..  /* Re
164f0 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
16500 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
16510 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
16520 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
16530 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
16540 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
16550 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
16560 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
16570 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
16580 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
16590 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
165a0 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
165b0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
165c0 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
165d0 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
165e0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
165f0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
16600 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
16610 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
16620 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
16630 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
16640 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16650 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16660 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
16670 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
16680 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
16690 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
166a0 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
166b0 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
166c0 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
166d0 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
166e0 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
166f0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
16700 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
16710 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
16720 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
16730 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
16740 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
16750 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
16760 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
16770 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
16780 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
16790 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
167a0 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
167b0 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
167c0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
167d0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
167e0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
167f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
16800 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
16810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16820 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
16830 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
16840 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
16850 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
16860 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
16870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16880 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
16890 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
168a0 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
168b0 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
168c0 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
168d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
168e0 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
168f0 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
16900 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
16910 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  *)aData)!=cksum 
16920 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16930 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
16940 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16950 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c  this page has al
16960 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
16970 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69  d by before duri
16980 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
16990 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
169a0 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
169b0 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
169c0 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
169d0 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
169e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
169f0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
16a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16a20 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
16a30 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
16a40 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
16a50 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
16a60 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
16a70 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
16a80 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
16a90 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
16aa0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
16ab0 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
16ac0 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
16ad0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
16ae0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16af0 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
16b00 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
16b10 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
16b20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
16b30 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
16b40 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
16b50 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
16b60 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
16b70 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
16b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16b90 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
16ba0 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
16bb0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
16bc0 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
16bd0 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
16be0 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
16bf0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
16c00 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
16c10 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
16c20 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
16c30 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
16c40 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
16c50 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
16c60 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
16c70 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
16c80 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
16c90 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
16ca0 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
16cb0 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
16cc0 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
16cd0 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
16ce0 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
16cf0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
16d00 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
16d10 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
16d20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
16d30 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
16d40 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
16d50 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
16d60 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
16d70 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
16d80 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
16d90 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
16da0 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
16db0 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
16dc0 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
16dd0 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
16de0 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
16df0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
16e00 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
16e10 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
16e20 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
16e30 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
16e40 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
16e50 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
16e60 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
16e70 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
16e80 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
16e90 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
16ea0 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
16eb0 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
16ec0 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
16ed0 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
16ee0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
16ef0 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
16f00 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
16f10 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
16f20 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
16f30 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
16f40 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
16f50 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
16f60 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
16f70 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
16f80 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
16f90 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
16fa0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
16fb0 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
16fc0 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
16fd0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
16fe0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
16ff0 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
17000 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
17010 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
17020 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17030 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17040 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17050 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
17060 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
17070 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
17080 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
17090 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
170a0 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
170b0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
170c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
170d0 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
170e0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
170f0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
17100 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
17110 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
17120 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
17130 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17140 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17150 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
17160 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
17170 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
17180 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
17190 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
171a0 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
171b0 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
171c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
171d0 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
171e0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
171f0 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
17200 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
17210 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
17220 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
17230 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
17240 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
17250 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
17260 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
17270 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
17280 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
17290 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
172a0 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
172b0 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
172c0 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
172d0 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
172e0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
172f0 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
17300 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
17310 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17320 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
17330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17340 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
17350 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
17360 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
17370 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
17380 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
17390 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
173a0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
173b0 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
173c0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
173d0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
173e0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
173f0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
17400 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
17410 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
17420 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
17430 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
17440 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
17450 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
17460 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
17470 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
17480 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
17490 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
174a0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
174b0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
174c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
174d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
174e0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
174f0 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
17500 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
17510 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
17520 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
17530 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
17540 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17550 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
17560 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
17570 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
17580 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
17590 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
175a0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
175b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
175c0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
175d0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
175e0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
175f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
17600 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
17610 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
17620 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
17630 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
17640 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
17650 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
17660 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
17670 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
17680 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
17690 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
176a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
176b0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
176c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
176d0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
176e0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
176f0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
17700 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
17710 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
17720 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
17730 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
17740 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
17750 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
17760 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17770 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
17780 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
17790 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
177a0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
177b0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
177c0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
177d0 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
177e0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
177f0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
17800 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
17810 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
17820 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
17830 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
17840 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
17850 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
17860 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
17870 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
17880 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
17890 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
178a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
178b0 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
178c0 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
178d0 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
178e0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
178f0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
17900 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
17910 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
17920 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
17930 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
17940 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
17950 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
17960 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
17970 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
17980 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
17990 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
179a0 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
179b0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
179c0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
179d0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
179e0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
179f0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
17a00 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
17a10 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
17a20 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
17a30 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
17a40 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
17a50 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
17a60 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
17a70 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
17a80 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
17a90 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
17aa0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
17ab0 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
17ac0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
17ad0 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
17ae0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
17af0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
17b00 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
17b10 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
17b20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17b30 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
17b40 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
17b50 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
17b60 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17b70 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)==0 );.    pPa
17b80 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
17b90 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  |= SPILLFLAG_ROL
17ba0 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  LBACK;.    rc = 
17bb0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17bc0 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17bd0 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17be0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
17bf0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
17c00 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17c10 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )!=0 );.    pPag
17c20 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
17c30 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  = ~SPILLFLAG_ROL
17c40 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72  LBACK;.    if( r
17c50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17c60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
17c70 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
17c80 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
17c90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
17ca0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
17cb0 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
17cc0 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
17cd0 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
17ce0 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
17cf0 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
17d00 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
17d10 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
17d20 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
17d30 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
17d40 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
17d50 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
17d60 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
17d70 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
17d80 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
17d90 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
17da0 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
17db0 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
17dc0 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
17dd0 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
17de0 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
17df0 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
17e00 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
17e10 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
17e20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
17e30 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75  memcpy(pData, (u
17e40 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
17e50 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17e60 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
17e70 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  er(pPg);.    if(
17e80 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28   isMainJrnl && (
17e90 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70  !isSavepnt || *p
17ea0 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e  Offset<=pPager->
17eb0 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
17ec0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
17ed0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
17ee0 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
17ef0 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
17f00 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
17f10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17f20 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
17f30 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
17f40 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
17f50 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
17f60 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
17f70 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
17f80 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
17f90 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
17fa0 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
17fb0 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
17fc0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
17fd0 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20  t out to the.   
17fe0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
17ff0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18000 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  * There is one e
18010 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
18020 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61   rule. If the pa
18030 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  ge is being roll
18040 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
18050 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61   as part of a sa
18060 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74  vepoint (or stat
18070 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20  ement) rollback 
18080 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a  from an .      *
18090 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  * unsynced porti
180a0 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  on of the main j
180b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
180c0 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  n it is not safe
180d0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72  .      ** to mar
180e0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
180f0 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63  ean. This is bec
18100 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65  ause marking the
18110 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a   page as.      *
18120 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65  * clean will cle
18130 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
18140 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e  D_SYNC flag. Sin
18150 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  ce the page is. 
18160 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
18170 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
18180 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e  ile (recorded in
18190 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
181a0 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  l) and.      ** 
181b0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
181c0 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61  YNC flag is clea
181d0 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65  red, if the page
181e0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
181f0 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
18200 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
18210 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ction, it will b
18220 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
18230 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  y but.      ** t
18240 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
18250 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74  NC flag will not
18260 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c   be set. It coul
18270 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c  d then potential
18280 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77  ly.      ** be w
18290 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20  ritten out into 
182a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
182b0 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75  e before its jou
182c0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
182d0 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79  ** segment is sy
182e0 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68  nced. If a crash
182f0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f   occurs during o
18300 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  r following this
18310 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  ,.      ** datab
18320 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  ase corruption m
18330 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20  ay ensue..      
18340 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
18350 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
18360 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73  ager) );.      s
18370 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
18380 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
18390 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
183a0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a  pagehash(pPg);..
183b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
183c0 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
183d0 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
183e0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
183f0 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
18400 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
18410 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
18420 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
18430 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
18440 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
18450 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
18460 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
18470 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
18480 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18490 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
184a0 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
184b0 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
184c0 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
184d0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
184e0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
184f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18500 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
18510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
18530 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
18540 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
18550 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18560 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
18570 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
18580 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
18590 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
185a0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
185b0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
185c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
185d0 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
185e0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
185f0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18600 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
18610 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
18620 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
18630 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
18640 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
18650 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
18660 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
18670 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
18680 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
18690 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
186a0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
186b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
186c0 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
186d0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
186e0 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
186f0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
18700 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
18710 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
18720 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
18730 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
18740 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
18750 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
18760 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
18770 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
18780 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
18790 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
187a0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
187b0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
187c0 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
187d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
187e0 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
187f0 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
18800 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
18810 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
18820 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
18830 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
18840 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
18850 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
18860 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
18870 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
18880 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
18890 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
188a0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
188b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
188c0 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
188d0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
188e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
188f0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
18900 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
18910 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
18920 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
18930 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
18940 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
18950 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
18960 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
18970 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
18980 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
18990 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
189a0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
189b0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
189c0 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
189d0 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
189e0 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
189f0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18a00 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18a10 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18a20 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
18a30 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18a40 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
18a50 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
18a60 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
18a70 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
18a80 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18a90 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
18aa0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
18ab0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
18ac0 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
18ad0 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
18ae0 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
18af0 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
18b00 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
18b10 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18b20 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
18b30 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
18b40 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
18b50 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
18b60 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
18b70 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
18b80 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
18b90 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18ba0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
18bb0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
18bc0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18bd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18be0 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18bf0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18c00 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18c10 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18c20 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
18c30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18c40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18c50 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
18c60 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
18c70 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
18c80 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18c90 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18ca0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18cc0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18cd0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18ce0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18cf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18d00 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18d10 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18d40 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
18d50 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
18d60 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
18d70 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
18d80 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18d90 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18da0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18db0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
18dc0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18dd0 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
18de0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
18df0 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
18e00 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
18e10 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
18e20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
18e30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
18e40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18e50 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18e60 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
18e70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
18e80 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
18e90 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
18ea0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
18eb0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
18ec0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
18ed0 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
18ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18ef0 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
18f00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18f10 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
18f20 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
18f30 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
18f40 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
18f50 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
18f60 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
18f70 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
18f80 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
18f90 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
18fa0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18fb0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
18fc0 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
18fd0 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
18fe0 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
18ff0 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
19000 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
19010 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
19020 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
19030 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
19040 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
19050 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
19060 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19070 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
19080 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
19090 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
190a0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
190b0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
190c0 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
190d0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
190e0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
190f0 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
19100 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19110 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
19120 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
19130 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
19140 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
19150 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
19160 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
19170 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
19180 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
19190 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
191a0 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
191b0 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
191c0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
191d0 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
191e0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
191f0 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
19200 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
19210 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
19220 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
19230 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
19240 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
19250 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
19260 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
19270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19280 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
19290 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
192a0 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
192b0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
192c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
192d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d  sqlite3Malloc(nM
192e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
192f0 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
19300 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
19310 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
19320 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
19330 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19340 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
19350 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
19360 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
19370 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
19380 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
19390 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
193a0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
193b0 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
193c0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
193d0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
193e0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
193f0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
19400 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
19410 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
19420 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
19430 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
19440 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
19450 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
19460 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
19470 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
19480 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
19490 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
194a0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
194b0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
194c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
194d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
194e0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
194f0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
19500 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
19510 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
19520 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
19530 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
19540 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
19550 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
19560 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
19570 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
19580 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
19590 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
195a0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
195b0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
195c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
195d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
195e0 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
195f0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
19600 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
19610 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
19620 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
19630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
19640 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
19650 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
19660 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
19670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19680 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
19690 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
196a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
196b0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
196c0 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
196d0 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
196e0 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
196f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
19700 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
19710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19720 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
19730 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19740 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
19750 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
19760 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
19770 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
19780 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
19790 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
197a0 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
197b0 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
197c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
197d0 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
197e0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
197f0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19800 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
19810 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
19820 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
19830 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
19840 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
19850 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
19860 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
19870 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
19880 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
19890 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
198a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
198b0 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
198c0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
198d0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
198e0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
198f0 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
19900 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19910 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
19920 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
19930 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19940 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
19950 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
19960 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
19970 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
19980 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
19990 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
199a0 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
199b0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
199c0 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
199d0 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
199e0 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
199f0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
19a00 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
19a10 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
19a20 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
19a30 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
19a40 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
19a50 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
19a60 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
19a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19a80 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
19a90 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
19aa0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
19ab0 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
19ac0 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
19ad0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
19ae0 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
19af0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
19b00 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
19b10 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
19b20 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
19b30 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
19b40 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
19b50 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
19b60 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62  * Or, it might b
19b70 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
19b80 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
19b90 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
19ba0 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
19bb0 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
19bc0 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
19bd0 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
19be0 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
19bf0 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
19c00 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
19c10 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
19c20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
19c30 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
19c40 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
19c50 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
19c60 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
19c70 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
19c80 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
19c90 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
19ca0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
19cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
19cc0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
19cd0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
19ce0 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
19cf0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
19d00 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
19d10 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
19d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19d30 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
19d40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
19d50 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
19d60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19d70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19d80 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
19d90 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
19da0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19db0 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te!=PAGER_READER
19dc0 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f   );.  .  if( isO
19dd0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
19de0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
19df0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
19e00 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
19e10 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
19e20 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a  GER_OPEN) .  ){.
19e30 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
19e40 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
19e50 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70    int szPage = p
19e60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19e80 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
19e90 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
19ea0 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
19eb0 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
19ec0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
19ed0 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
19ee0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
19ef0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
19f00 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
19f10 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67   newSize = szPag
19f20 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
19f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19f40 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
19f50 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
19f60 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
19f70 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
19f80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19f90 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
19fa0 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
19fb0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
19fc0 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a   if( (currentSiz
19fd0 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69  e+szPage)<=newSi
19fe0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ze ){.        ch
19ff0 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65  ar *pTmp = pPage
1a000 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1a010 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d        memset(pTm
1a020 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20  p, 0, szPage);. 
1a030 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a040 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1a050 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65  ) == currentSize
1a060 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1a070 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
1a080 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e  zPage) >  curren
1a090 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
1a0a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1a0b0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1a0c0 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e   pTmp, szPage, n
1a0d0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a  ewSize-szPage);.
1a0e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a0f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a100 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1a110 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1a120 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
1a130 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a140 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1a150 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65  eturn a sanitize
1a160 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
1a170 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20   sector-size of 
1a180 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54  OS file pFile. T
1a190 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
1a1a0 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ue is guaranteed
1a1b0 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20   to lie between 
1a1c0 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f  32 and MAX_SECTO
1a1d0 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73  R_SIZE..*/.int s
1a1e0 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a1f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1a200 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  File){.  int iRe
1a210 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  t = sqlite3OsSec
1a220 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a  torSize(pFile);.
1a230 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b    if( iRet<32 ){
1a240 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b  .    iRet = 512;
1a250 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65  .  }else if( iRe
1a260 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  t>MAX_SECTOR_SIZ
1a270 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
1a280 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a290 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65  >=512 );.    iRe
1a2a0 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  t = MAX_SECTOR_S
1a2b0 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
1a2c0 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iRet;.}../*.**
1a2d0 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
1a2e0 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
1a2f0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1a300 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
1a310 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
1a320 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1a330 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1a340 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
1a350 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
1a360 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
1a370 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1a380 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  be used .** to d
1a390 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1a3a0 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
1a3b0 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
1a3c0 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
1a3d0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1a3e0 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
1a3f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
1a400 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
1a410 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
1a420 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a430 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
1a440 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
1a450 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
1a460 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
1a470 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
1a480 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
1a490 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
1a4a0 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
1a4b0 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
1a4c0 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
1a4d0 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
1a4e0 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
1a4f0 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
1a500 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1a510 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
1a520 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
1a530 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20  TOR_SIZE..**.** 
1a540 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  If the file has 
1a550 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
1a560 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a570 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74  RITE property, t
1a580 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65  hen set.** the e
1a590 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a5a0 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  size to its mini
1a5b0 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e  mum value (512).
1a5c0 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
1a5d0 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74  .** pPager->sect
1a5e0 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66  orSize is to def
1a5f0 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72  ine the "blast r
1a600 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20  adius" of bytes 
1a610 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1a620 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20  ange if a crash 
1a630 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
1a640 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ting to a single
1a650 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74   byte in.** that
1a660 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74   range.  But wit
1a670 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  h POWERSAFE_OVER
1a680 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74  WRITE, the blast
1a690 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a   radius is zero.
1a6a0 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74  ** (that is what
1a6b0 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1a6c0 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20  RITE means), so 
1a6d0 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  we minimize the 
1a6e0 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20  sector.** size. 
1a6f0 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
1a700 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20  ompatibility of 
1a710 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1a720 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1a730 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72  ,.** we cannot r
1a740 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1a750 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a760 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74  below 512..*/.st
1a770 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
1a780 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
1a790 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
1a7a0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1a7b0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1a7c0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
1a7d0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
1a7e0 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  ile.   || (sqlit
1a7f0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1a800 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1a810 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20  ->fd) & .       
1a820 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1a830 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1a840 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b  ERWRITE)!=0.  ){
1a850 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
1a860 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
1a870 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
1a880 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
1a890 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
1a8a0 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
1a8b0 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
1a8c0 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
1a8d0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1a8e0 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
1a8f0 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70  gfault. */.    p
1a900 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1a910 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  e = 512;.  }else
1a920 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
1a930 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
1a940 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  e3SectorSize(pPa
1a950 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a  ger->fd);.  }.}.
1a960 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1a970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1a980 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
1a990 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1a9a0 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
1a9b0 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
1a9c0 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
1a9d0 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
1a9e0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1a9f0 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
1aa00 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
1aa10 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
1aa20 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
1aa30 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
1aa40 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
1aa50 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1aa60 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1aa70 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
1aa80 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
1aa90 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
1aaa0 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
1aab0 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1aac0 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
1aad0 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1aae0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
1aaf0 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
1ab00 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
1ab10 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
1ab20 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1ab30 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
1ab40 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
1ab50 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
1ab60 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
1ab70 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
1ab80 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1ab90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1aba0 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
1abb0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
1abc0 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
1abd0 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
1abe0 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
1abf0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1ac00 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
1ac10 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
1ac20 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
1ac30 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1ac40 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
1ac50 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1ac60 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1ac70 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73  ch is the page s
1ac80 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65  ize..**  (7)  ze
1ac90 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74  ro padding out t
1aca0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
1acb0 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20  r size..**  (8) 
1acc0 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
1acd0 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
1ace0 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
1acf0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1ad00 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
1ad10 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
1ad20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1ad30 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
1ad40 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1ad50 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
1ad60 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
1ad70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1ad80 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
1ad90 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20  e first 7 items 
1ada0 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
1adb0 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
1adc0 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
1add0 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74  ce of the 8th it
1ade0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
1adf0 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
1ae00 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
1ae10 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
1ae20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
1ae30 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
1ae40 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
1ae50 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
1ae60 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
1ae70 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
1ae80 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
1ae90 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1aea0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
1aeb0 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
1aec0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
1aed0 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
1aee0 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
1aef0 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
1af00 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
1af10 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
1af20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1af30 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
1af40 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
1af50 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
1af60 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
1af70 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
1af80 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
1af90 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
1afa0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
1afb0 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
1afc0 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
1afd0 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
1afe0 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
1aff0 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
1b000 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1b010 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1b020 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
1b030 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1b040 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
1b050 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
1b060 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
1b070 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1b080 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
1b090 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
1b0a0 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
1b0b0 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
1b0c0 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
1b0d0 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
1b0e0 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
1b0f0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
1b100 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
1b110 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
1b120 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
1b130 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
1b140 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
1b150 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
1b160 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
1b170 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
1b180 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
1b190 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
1b1a0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
1b1b0 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
1b1c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1b1d0 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
1b1e0 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
1b1f0 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
1b200 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
1b210 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
1b220 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b230 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
1b240 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
1b250 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
1b260 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1b270 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
1b280 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
1b290 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
1b2a0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
1b2b0 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
1b2c0 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
1b2d0 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
1b2e0 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
1b2f0 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
1b300 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1b310 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
1b320 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
1b330 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
1b340 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
1b350 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
1b360 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
1b370 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
1b380 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
1b390 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
1b3a0 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
1b3b0 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
1b3c0 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
1b3d0 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
1b3e0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
1b3f0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1b400 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
1b410 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
1b420 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
1b430 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
1b440 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
1b450 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
1b460 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
1b470 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
1b480 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
1b490 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
1b4a0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1b4b0 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
1b4c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1b4d0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1b4e0 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b500 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
1b510 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
1b520 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
1b530 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b540 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1b550 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
1b560 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
1b570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b580 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1b590 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1b5a0 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
1b5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b5c0 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
1b5d0 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
1b5e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b600 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
1b610 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
1b620 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
1b630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1b640 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b650 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1b660 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
1b670 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
1b680 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
1b690 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b6a0 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
1b6b0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
1b6c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1b6d0 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
1b6e0 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
1b6f0 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
1b700 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20   nPlayback = 0; 
1b710 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1b720 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72  umber of pages r
1b730 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75  estored from jou
1b740 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  rnal */..  /* Fi
1b750 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1b760 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1b770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1b780 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1b790 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1b7a0 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1b7b0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1b7c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1b7d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1b7e0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1b7f0 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1b800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b810 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1b820 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1b830 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1b840 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1b850 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b860 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1b870 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1b880 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b890 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1b8a0 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1b8b0 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1b8c0 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1b8d0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1b8e0 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1b8f0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1b900 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1b910 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1b920 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1b930 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1b940 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1b950 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1b960 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1b970 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1b980 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1b990 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1b9a0 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1b9b0 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1b9c0 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1b9d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1b9e0 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1b9f0 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74  x.c,.  **  mxPat
1ba00 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1ba10 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1ba20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1ba30 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1ba40 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1ba50 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1ba60 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1ba70 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1ba80 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1ba90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1baa0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1bab0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1bac0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bad0 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1bae0 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1baf0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1bb00 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1bb10 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1bb20 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1bb30 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1bb40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bb50 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1bb60 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1bb70 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1bb80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1bb90 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1bba0 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1bbb0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1bbc0 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1bbd0 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1bbe0 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1bbf0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1bc00 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1bc10 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1bc20 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1bc30 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1bc40 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1bc50 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1bc60 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1bc70 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1bc80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1bc90 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1bca0 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1bcb0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1bcc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1bcd0 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1bce0 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1bcf0 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1bd00 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1bd10 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1bd20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1bd30 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1bd40 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1bd50 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1bd60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1bd70 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1bd80 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1bd90 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1bda0 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1bdb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bdc0 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1bdd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1bde0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1bdf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1be00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1be10 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1be20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1be30 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1be40 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1be50 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1be60 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1be70 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1be80 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1be90 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1bea0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1beb0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1bec0 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1bed0 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1bee0 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1bef0 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1bf00 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1bf10 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1bf20 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1bf30 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1bf40 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1bf50 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1bf60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1bf70 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1bf80 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bf90 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1bfa0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1bfb0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1bfc0 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1bfd0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1bfe0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1bff0 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1c000 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1c010 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1c020 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1c030 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1c040 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1c050 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1c060 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1c070 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1c080 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1c090 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c0a0 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1c0b0 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1c0c0 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1c0d0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1c0e0 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1c0f0 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1c100 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1c110 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1c120 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1c130 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1c140 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1c150 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1c160 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1c170 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1c180 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1c190 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1c1a0 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1c1b0 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1c1c0 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1c1d0 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1c1e0 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1c1f0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1c200 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1c210 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1c220 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1c230 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1c240 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1c250 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1c260 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1c270 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1c280 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1c290 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1c2a0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1c2b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1c2c0 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1c2d0 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1c2e0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1c2f0 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1c300 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c310 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c320 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1c330 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1c340 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c350 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1c360 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1c370 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c380 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1c390 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1c3a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1c3b0 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1c3c0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1c3d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1c3e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1c3f0 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1c400 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1c410 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1c420 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1c430 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1c440 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1c450 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c460 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1c470 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c480 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1c490 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1c4a0 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1c4b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c4c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c4d0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c4e0 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1c4f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1c500 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1c510 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1c520 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1c530 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1c540 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1c550 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1c560 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1c570 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1c580 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1c590 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1c5a0 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1c5b0 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1c5c0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1c5d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1c5e0 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1c5f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1c600 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1c610 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1c620 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1c630 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1c640 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c660 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20    nPlayback++;. 
1c670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c680 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c690 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1c6a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1c6b0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
1c6c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c6d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1c6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1c6f0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1c700 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c710 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
1c720 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c   been truncated,
1c730 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61   simply stop rea
1c740 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20  ding and.       
1c750 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1c760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68   the journal. Th
1c770 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20  is might happen 
1c780 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  if the journal w
1c790 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1c7a0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77  not completely w
1c7b0 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65  ritten and synce
1c7c0 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61  d prior to a cra
1c7d0 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20  sh.  In that.   
1c7e0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20         ** case, 
1c7f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
1c800 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62  uld have never b
1c810 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74  een written in t
1c820 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1c830 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69  first place so i
1c840 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c  t is OK to simpl
1c850 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f  y abandon the ro
1c860 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  llback. */.     
1c870 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c880 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1c890 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c8a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c8c0 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
1c8d0 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74  o rollback, quit
1c8e0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
1c8f0 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1c900 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77  ** code.  This w
1c910 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61  ill cause the pa
1c920 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
1c930 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20   error state.   
1c940 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61         ** so tha
1c950 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72  t no further har
1c960 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20  m will be done. 
1c970 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
1c980 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
1c990 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
1c9a0 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c  long will be abl
1c9b0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e to rollback th
1c9c0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
1c9d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c9e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c9f0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
1ca00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ca10 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
1ca20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
1ca30 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
1ca40 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20  .  /* Following 
1ca50 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  a rollback, the 
1ca60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1ca70 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20  ould be back in 
1ca80 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
1ca90 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f  * state prior to
1caa0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1cab0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73  e transaction, s
1cac0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a  o invoke the.  *
1cad0 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  * SQLITE_FCNTL_D
1cae0 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65  B_UNCHANGED file
1caf0 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  -control method 
1cb00 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20  to disable the. 
1cb10 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68   ** assertion th
1cb20 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1cb30 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d  on counter was m
1cb40 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69  odified..  */.#i
1cb50 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cb60 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  G.  if( pPager->
1cb70 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1cb80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
1cb90 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
1cba0 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
1cbb0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1cbc0 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  D,0);.  }.#endif
1cbd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1cbe0 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
1cbf0 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
1cc00 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
1cc10 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
1cc20 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
1cc30 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
1cc40 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
1cc50 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
1cc60 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
1cc70 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
1cc80 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
1cc90 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
1cca0 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
1ccb0 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
1ccc0 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
1ccd0 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
1cce0 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
1ccf0 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
1cd00 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
1cd10 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
1cd20 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
1cd30 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
1cd40 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
1cd50 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1cd60 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
1cd70 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
1cd80 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
1cd90 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
1cda0 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
1cdb0 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
1cdc0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
1cdd0 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
1cde0 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
1cdf0 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
1ce00 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
1ce10 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
1ce20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1ce30 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
1ce40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
1ce50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ce60 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
1ce70 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1ce80 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
1ce90 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1cea0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1ceb0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1cec0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1ced0 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
1cee0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cef0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cf00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
1cf10 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1cf20 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1cf30 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1cf40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1cf50 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72  OPEN).  ){.    r
1cf60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cf70 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b  Sync(pPager, 0);
1cf80 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1cf90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cfa0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
1cfb0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1cfc0 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
1cfd0 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  \0', 0);.    tes
1cfe0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1cff0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d010 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1d020 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1d030 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1d040 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1d050 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1d060 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1d070 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1d080 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1d090 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1d0a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1d0b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1d0c0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1d0d0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1d0e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d0f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1d100 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26   }.  if( isHot &
1d110 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20  & nPlayback ){. 
1d120 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
1d130 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
1d140 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22  OVER_ROLLBACK, "
1d150 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67  recovered %d pag
1d160 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20  es from %s",.   
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c               nPl
1d180 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e  ayback, pPager->
1d190 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a  zJournal);.  }..
1d1a0 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
1d1b0 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1d1c0 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
1d1d0 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
1d1e0 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
1d1f0 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
1d200 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1d210 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1d220 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
1d230 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
1d240 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
1d250 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
1d260 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
1d270 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1d280 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1d290 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1d2a0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
1d2b0 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
1d2c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d2d0 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
1d2e0 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
1d2f0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
1d300 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
1d310 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1d320 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
1d330 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1d340 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1d350 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
1d360 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
1d370 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
1d380 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
1d390 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
1d3a0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
1d3b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1d3c0 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
1d3d0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1d3e0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
1d3f0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1d400 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
1d410 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
1d420 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d430 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1d440 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
1d450 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20  , u32 iFrame){. 
1d460 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d470 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1d480 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1d490 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1d4a0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1d4b0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1d4c0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1d4d0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1d4e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1d4f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1d500 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d510 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
1d520 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d530 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
1d540 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
1d550 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1d560 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1d570 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d  R_READER && !MEM
1d580 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1d590 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1d5a0 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  d) );..#ifndef S
1d5b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1d5c0 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1d5d0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1d5e0 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1d5f0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1d600 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1d610 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1d620 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1d630 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c  l, iFrame, pgsz,
1d640 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1d650 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1d660 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1d670 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1d680 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1d690 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1d6a0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1d6b0 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1d6c0 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1d6d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d6e0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d6f0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1d700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d720 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1d730 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1d740 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1d750 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1d760 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1d770 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1d780 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1d790 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1d7a0 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1d7b0 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1d7c0 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1d7d0 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1d7e0 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d7f0 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1d800 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1d810 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1d820 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1d830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1d840 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1d850 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1d860 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1d870 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1d880 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1d890 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1d8a0 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1d8b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d8c0 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1d8d0 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1d8e0 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1d8f0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1d900 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1d910 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1d920 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1d930 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1d940 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1d950 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1d960 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1d970 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1d980 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1d990 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69  ite noise equali
1d9a0 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30  ng 16 bytes of 0
1d9b0 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67  xff is vanishing
1d9c0 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20  ly small so.    
1d9d0 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73    ** we should s
1d9e0 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20  till be ok..    
1d9f0 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65    */.      memse
1da00 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  t(pPager->dbFile
1da10 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65  Vers, 0xff, size
1da20 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1da30 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c  eVers));.    }el
1da40 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62  se{.      u8 *db
1da50 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38  FileVers = &((u8
1da60 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
1da70 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
1da80 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1da90 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
1daa0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1dab0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1dac0 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31    }.  }.  CODEC1
1dad0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
1dae0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
1daf0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   = SQLITE_NOMEM)
1db00 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
1db10 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1db20 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1db30 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1db40 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1db50 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1db60 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1db70 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
1db80 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E(("FETCH %d pag
1db90 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1dba0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1dbb0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1dbc0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
1dbd0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
1dbe0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1dbf0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
1dc00 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1dc10 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1dc20 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64  t offsets 24 and
1dc30 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65   92 in.** the he
1dc40 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c  ader and the sql
1dc50 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1dc60 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e  er at offset 96.
1dc70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
1dc80 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  n unconditional 
1dc90 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73  update.  See als
1dca0 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72  o the pager_incr
1dcb0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
1dcc0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63  .** routine whic
1dcd0 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74  h only updates t
1dce0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1dcf0 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20  r if the update 
1dd00 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e  is actually.** n
1dd10 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d  eeded, as determ
1dd20 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67  ined by the pPag
1dd30 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1dd40 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62  one state variab
1dd50 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1dd60 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63  id pager_write_c
1dd70 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48  hangecounter(PgH
1dd80 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20  dr *pPg){.  u32 
1dd90 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1dda0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1ddb0 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1ddc0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1ddd0 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1dde0 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
1ddf0 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
1de00 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67  et4byte((u8*)pPg
1de10 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ->pPager->dbFile
1de20 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32  Vers)+1;.  put32
1de30 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1de40 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
1de50 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
1de60 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74   /* Also store t
1de70 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  he SQLite versio
1de80 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65  n number in byte
1de90 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a  s 96..99 and in.
1dea0 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
1deb0 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
1dec0 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
1ded0 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
1dee0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20   number.  ** is 
1def0 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33  valid. */.  put3
1df00 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1df10 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68  g->pData)+92, ch
1df20 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1df30 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1df40 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39  r*)pPg->pData)+9
1df50 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  6, SQLITE_VERSIO
1df60 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69  N_NUMBER);.}..#i
1df70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1df80 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_WAL./*.** This
1df90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
1dfa0 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  oked once for ea
1dfb0 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ch page that has
1dfc0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a   already been .*
1dfd0 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  * written into t
1dfe0 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e  he log file when
1dff0 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1e000 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1e010 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  k..** Parameter 
1e020 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20  iPg is the page 
1e030 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70  number of said p
1e040 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72  age. The pCtx ar
1e050 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63  gument .** is ac
1e060 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
1e070 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
1e080 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
1e090 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72  f page iPg is pr
1e0a0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63  esent in the cac
1e0b0 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f  he, and has no o
1e0c0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1e0d0 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ences,.** it is 
1e0e0 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72  discarded. Other
1e0f0 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61  wise, if there a
1e100 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
1e110 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65  utstanding.** re
1e120 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61  ferences, the pa
1e130 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65  ge content is re
1e140 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
1e150 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
1e160 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72  .** attempt to r
1e170 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72  eload content fr
1e180 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1e190 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20  is required and 
1e1a0 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72  fails, .** retur
1e1b0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
1e1c0 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
1e1d0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
1e1e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e1f0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f  rUndoCallback(vo
1e200 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69  id *pCtx, Pgno i
1e210 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1e220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1e230 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
1e240 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67  ger *)pCtx;.  Pg
1e250 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
1e260 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1e270 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
1e280 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
1e290 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69  Lookup(pPager, i
1e2a0 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg);.  if( pPg )
1e2b0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1e2c0 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
1e2d0 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20  unt(pPg)==1 ){. 
1e2e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
1e2f0 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20  heDrop(pPg);.   
1e300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33   }else{.      u3
1e310 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  2 iFrame = 0;.  
1e320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e330 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
1e340 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e  ger->pWal, pPg->
1e350 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
1e360 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e380 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1e390 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b  ge(pPg, iFrame);
1e3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e3b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1e3d0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
1e3e0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1e3f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1e400 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
1e410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1e420 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20   Normally, if a 
1e430 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1e440 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20  olled back, any 
1e450 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
1e460 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65   are.  ** update
1e470 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70  d as data is cop
1e480 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72  ied out of the r
1e490 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1e4a0 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  and into the.  *
1e4b0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
1e4c0 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c   is not generall
1e4d0 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20  y possible with 
1e4e0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
1e4f0 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  as.  ** rollback
1e500 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79   involves simply
1e510 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
1e520 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66  log file. Theref
1e530 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  ore, if one.  **
1e540 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20   or more frames 
1e550 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1e560 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1e570 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66   log (and theref
1e580 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63  ore .  ** also c
1e590 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
1e5a0 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29  ackup databases)
1e5b0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
1e5c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
1e5d0 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d  ** the backups m
1e5e0 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64  ust be restarted
1e5f0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1e600 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
1e610 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
1e620 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e630 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e640 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1e650 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  o rollback a tra
1e660 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41  nsaction on a WA
1e670 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  L database..*/.s
1e680 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52  tatic int pagerR
1e690 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72  ollbackWal(Pager
1e6a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1e6b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e6d0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
1e6e0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20   PgHdr *pList;  
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74   /* List of dirt
1e710 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72  y pages to rever
1e720 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  t */..  /* For a
1e730 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
1e740 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63  cache that are c
1e750 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f  urrently dirty o
1e760 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  r have already. 
1e770 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e   ** been written
1e780 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74   (but not commit
1e790 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20  ted) to the log 
1e7a0 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20  file, do one of 
1e7b0 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  the .  ** follow
1e7c0 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
1e7d0 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63   + Discard the c
1e7e0 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72  ached page (if r
1e7f0 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a  efcount==0), or.
1e800 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20    **   + Reload 
1e810 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  page content fro
1e820 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  m the database (
1e830 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a  if refcount>0)..
1e840 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
1e850 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1e860 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63  dbOrigSize;.  rc
1e870 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64   = sqlite3WalUnd
1e880 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
1e890 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1e8a0 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  k, (void *)pPage
1e8b0 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
1e8c0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1e8d0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1e8e0 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  ache);.  while( 
1e8f0 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
1e900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
1e910 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
1e920 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
1e930 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
1e940 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
1e950 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
1e960 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
1e970 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
1e980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e990 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e9a0 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
1e9b0 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
1e9c0 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
1e9d0 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
1e9e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1e9f0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1ea00 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
1ea10 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
1ea20 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
1ea30 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
1ea40 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
1ea50 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
1ea60 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
1ea70 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
1ea80 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66  *.** The list of
1ea90 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e   pages passed in
1eaa0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1eab0 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64  is always sorted
1eac0 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
1ead0 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61  .** Hence, if pa
1eae0 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79  ge 1 appears any
1eaf0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73  where on the lis
1eb00 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68  t, it will be th
1eb10 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f  e first page..*/
1eb20 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67   .static int pag
1eb30 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50  erWalFrames(.  P
1eb40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb60 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1eb70 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
1eb80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1eb90 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1eba0 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a  rames to log */.
1ebb0 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65    Pgno nTruncate
1ebc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ebd0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1ebe0 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f  ze after this co
1ebf0 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mmit */.  int is
1ec00 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
1ec10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1ec20 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63  e if this is a c
1ec30 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ommit */.){.  in
1ec40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ec60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1ec70 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20    int nList;    
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1eca0 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f  ages in pList */
1ecb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1ecc0 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1ecd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45  fined(SQLITE_CHE
1ece0 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48 64  CK_PAGES).  PgHd
1ecf0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ed10 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1ed20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  pages */.#endif.
1ed30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ed40 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73  r->pWal );.  ass
1ed50 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69  ert( pList );.#i
1ed60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1ed70 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
1ed80 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74  at the page list
1ed90 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   is in accending
1eda0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28   order */.  for(
1edb0 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d  p=pList; p && p-
1edc0 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44  >pDirty; p=p->pD
1edd0 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72  irty){.    asser
1ede0 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e  t( p->pgno < p->
1edf0 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a  pDirty->pgno );.
1ee00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1ee10 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69  sert( pList->pDi
1ee20 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d  rty==0 || isComm
1ee30 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f  it );.  if( isCo
1ee40 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  mmit ){.    /* I
1ee50 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  f a WAL transact
1ee60 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ion is being com
1ee70 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73  mitted, there is
1ee80 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69   no point in wri
1ee90 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20  ting.    ** any 
1eea0 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20  pages with page 
1eeb0 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20  numbers greater 
1eec0 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69  than nTruncate i
1eed0 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nto the WAL file
1eee0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69  ..    ** They wi
1eef0 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ll never be read
1ef00 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20   by any client. 
1ef10 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  So remove them f
1ef20 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20  rom the pDirty. 
1ef30 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e     ** list here.
1ef40 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70   */.    PgHdr *p
1ef50 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  ;.    PgHdr **pp
1ef60 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1ef70 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20     nList = 0;.  
1ef80 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28    for(p=pList; (
1ef90 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b  *ppNext = p)!=0;
1efa0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1efb0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
1efc0 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  <=nTruncate ){. 
1efd0 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20         ppNext = 
1efe0 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  &p->pDirty;.    
1eff0 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20      nList++;.   
1f000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1f010 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1f020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69    }else{.    nLi
1f030 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50  st = 1;.  }.  pP
1f040 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
1f050 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d  R_STAT_WRITE] +=
1f060 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70   nList;..  if( p
1f070 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
1f080 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1f090 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
1f0a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f0b0 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
1f0c0 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
1f0d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1f0e0 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
1f0f0 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61  e, isCommit, pPa
1f100 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
1f110 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  s.  );.  if( rc=
1f120 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1f130 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
1f140 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
1f150 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1f160 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1f170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1f180 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1f190 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70  r->pBackup, p->p
1f1a0 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44  gno, (u8 *)p->pD
1f1b0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1f1c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1f1d0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69  HECK_PAGES.  pLi
1f1e0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1f1f0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1f200 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1f210 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f220 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f230 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
1f240 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e  hash(p);.  }.#en
1f250 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1f260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
1f270 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
1f280 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a  ion on the WAL..
1f290 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f2a0 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61  ne used to be ca
1f2b0 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53  lled "pagerOpenS
1f2c0 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75  napshot()" becau
1f2d0 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c  se it essentiall
1f2e0 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61  y.** makes a sna
1f2f0 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74  pshot of the dat
1f300 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72  abase at the cur
1f310 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69  rent point in ti
1f320 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73  me and preserves
1f330 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f  .** that snapsho
1f340 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1f350 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65   reader in spite
1f360 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79   of concurrently
1f370 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f   changes by.** o
1f380 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20  ther writers or 
1f390 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a  checkpointers..*
1f3a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f3b0 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
1f3c0 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
1f3d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f400 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1f410 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f430 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
1f440 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
1f450 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1f460 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1f470 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f480 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f490 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
1f4a0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
1f4b0 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73  EADER );..  /* s
1f4c0 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1f4d0 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
1f4e0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
1f4f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
1f500 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1f510 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
1f520 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
1f530 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
1f540 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
1f550 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
1f560 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
1f570 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
1f580 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
1f590 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
1f5a0 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
1f5b0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
1f5c0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f5d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1f5e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f5f0 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
1f600 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1f610 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
1f620 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f630 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b  OK || changed ){
1f640 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
1f650 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1f660 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
1f670 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
1f680 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
1f690 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
1f6a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1f6b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1f6c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f6d0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1f6e0 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
1f6f0 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
1f700 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
1f710 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
1f720 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
1f730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f740 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
1f750 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
1f760 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
1f770 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
1f780 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
1f790 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1f7a0 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
1f7b0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1f7c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1f7d0 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
1f7e0 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
1f7f0 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
1f800 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
1f810 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
1f820 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f830 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
1f840 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
1f850 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
1f860 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f870 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1f880 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
1f890 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
1f8a0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1f8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1f8c0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1f8d0 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1f8e0 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
1f8f0 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
1f900 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f910 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
1f920 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
1f930 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
1f940 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
1f950 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
1f960 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
1f970 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1f980 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
1f990 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
1f9a0 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1f9b0 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
1f9c0 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1f9d0 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
1f9e0 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
1f9f0 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
1fa00 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
1fa10 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
1fa20 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
1fa30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1fa40 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1fa50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1fa60 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1fa70 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67  D_LOCK );.  nPag
1fa80 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
1fa90 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
1faa0 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
1fab0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1fac0 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  as not available
1fad0 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1fae0 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64  b-system,.  ** d
1faf0 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65  etermine it base
1fb00 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
1fb10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fb20 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a  le. If the size.
1fb30 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
1fb40 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1fb50 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
1fb60 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65  iple of the page
1fb70 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e  -size,.  ** roun
1fb80 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65  d down to the ne
1fb90 61 72 65 73 74 20 70 61 67 65 2e 20 45 78 63 65  arest page. Exce
1fba0 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72  pt, any file lar
1fbb0 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20  ger than 0.  ** 
1fbc0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73  bytes in size is
1fbd0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63   considered to c
1fbe0 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20  ontain at least 
1fbf0 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  one page..  */. 
1fc00 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1fc10 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1fc40 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1fc50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
1fc60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1fc70 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1fc80 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1fc90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1fca0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  d) ){.      int 
1fcb0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1fcc0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1fcd0 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  d, &n);.      if
1fce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fcf0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1fd00 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1fd10 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
1fd20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
1fd30 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
1fd40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fd50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1fd60 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1fd70 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1fd80 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
1fd90 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
1fda0 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
1fdb0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
1fdc0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
1fdd0 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
1fde0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
1fdf0 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
1fe00 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1fe10 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
1fe20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
1fe30 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
1fe40 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
1fe50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1fe60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fe70 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1fe80 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1fe90 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
1fea0 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
1feb0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
1fec0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1fed0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
1fee0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
1fef0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1ff00 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
1ff10 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
1ff20 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
1ff30 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
1ff40 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
1ff50 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
1ff60 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
1ff70 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1ff80 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
1ff90 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
1ffa0 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
1ffb0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
1ffc0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1ffd0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
1ffe0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
1fff0 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20000 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20010 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
20020 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
20030 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
20040 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
20050 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
20060 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
20070 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20080 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20090 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
200a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
200b0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
200c0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
200d0 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
200e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
200f0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20100 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20110 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
20120 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
20130 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
20140 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
20150 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
20160 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
20170 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
20180 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
20190 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
201a0 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
201b0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
201c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
201d0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
201e0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
201f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20200 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20210 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20220 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20240 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20250 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
20260 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20270 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
20280 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20290 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
202a0 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
202b0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
202c0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
202d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
202e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
202f0 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
20300 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
20310 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
20320 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20330 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
20340 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20360 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
20370 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
20380 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
20390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
203a0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
203b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
203c0 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
203d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
203e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
203f0 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20400 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20410 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
20420 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20430 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
20440 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
20450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20460 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
20470 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
20480 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
20490 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
204a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
204b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
204c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
204d0 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
204e0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
204f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
20500 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
20510 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
20520 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20530 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
20540 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20550 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
20560 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
20570 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20580 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
20590 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
205a0 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
205b0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
205c0 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
205d0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
205e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
205f0 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
20600 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
20610 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
20620 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
20630 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
20640 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
20650 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
20660 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
20670 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
20680 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
20690 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
206a0 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
206b0 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
206c0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
206d0 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
206e0 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
206f0 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
20700 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
20710 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
20720 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
20730 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
20740 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20750 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20760 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
20770 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
20780 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20790 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
207a0 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
207b0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
207c0 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
207d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
207e0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
207f0 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
20800 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20810 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
20820 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
20830 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20840 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
20850 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
20860 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
20870 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
20880 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
20890 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
208a0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
208b0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
208c0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
208d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
208e0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
208f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
20900 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
20910 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20920 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
20930 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
20940 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
20950 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
20960 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
20970 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
20980 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
20990 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
209a0 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
209b0 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
209c0 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
209d0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
209e0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
209f0 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
20a00 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
20a10 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
20a20 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
20a30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20a40 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
20a50 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
20a60 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
20a70 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
20a80 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
20a90 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
20aa0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
20ab0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
20ac0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
20ad0 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
20ae0 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
20af0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20b00 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20b10 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
20b20 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
20b30 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
20b40 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
20b50 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
20b60 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
20b70 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
20b80 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
20b90 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
20ba0 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
20bb0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
20bc0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
20bd0 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
20be0 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
20bf0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
20c00 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
20c10 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
20c20 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
20c30 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
20c40 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
20c50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20c60 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
20c70 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
20c80 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
20c90 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
20ca0 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
20cd0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
20ce0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
20cf0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
20d00 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
20d10 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
20d20 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
20d30 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
20d40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
20d50 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20d60 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
20d70 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
20d80 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
20d90 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
20da0 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
20db0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
20dc0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
20dd0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
20de0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20df0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
20e00 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
20e10 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
20e20 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
20e30 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
20e40 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
20e50 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
20e60 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
20e70 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
20e80 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
20e90 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
20ea0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
20eb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20ec0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
20ed0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
20ee0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
20ef0 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
20f00 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
20f10 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
20f20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
20f30 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
20f40 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
20f50 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
20f60 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
20f70 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
20f80 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50  dbOrigSize;.  pP
20f90 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
20fa0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
20fb0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
20fc0 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20   !pSavepoint && 
20fd0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20fe0 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
20ff0 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  n pagerRollbackW
21000 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
21010 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
21020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
21030 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
21040 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
21050 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
21060 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
21070 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
21080 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
21090 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
210a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
210b0 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
210c0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
210d0 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
210e0 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
210f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
21100 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
21110 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
21120 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21130 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  f;.  assert( pag
21140 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21150 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b  ==0 || szJ==0 );
21160 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
21170 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
21180 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
21190 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
211a0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
211b0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
211c0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
211d0 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
211e0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
211f0 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
21200 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
21210 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
21220 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
21230 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
21240 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
21250 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
21260 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
21270 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
21280 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
21290 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
212a0 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
212b0 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
212c0 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
212d0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
212e0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26  if( pSavepoint &
212f0 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
21300 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48  Pager) ){.    iH
21310 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
21320 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
21330 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
21340 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
21350 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21360 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
21370 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
21380 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
21390 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
213a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
213b0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
213c0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
213d0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
213e0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
213f0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
21400 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21410 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21420 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  E_DONE );.  }els
21430 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
21440 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
21450 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75   }..  /* Continu
21460 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  e rolling back r
21470 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68  ecords out of th
21480 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
21490 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
214a0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
214b0 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e  l header seen an
214c0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74  d continuing unt
214d0 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  il the effective
214e0 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65   end.  ** of the
214f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
21500 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  le.  Continue to
21510 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e   skip out-of-ran
21520 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a  ge pages and.  *
21530 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e  * continue addin
21540 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  g pages rolled b
21550 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20  ack to pDone..  
21560 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
21570 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
21580 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
21590 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69  szJ ){.    u32 i
215a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
215b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
215c0 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
215d0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
215e0 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
215f0 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
21600 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
21610 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
21620 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26  Pager, 0, szJ, &
21630 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
21640 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21650 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
21660 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
21670 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
21680 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
21690 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
216a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
216b0 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
216c0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
216d0 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
216e0 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
216f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
21700 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
21710 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
21720 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
21730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21740 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
21750 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
21760 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
21770 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
21780 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21790 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
217a0 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
217b0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
217c0 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
217d0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
217e0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
217f0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
21800 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
21810 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21820 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
21830 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21840 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
21850 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
21860 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
21870 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
21880 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
21890 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
218a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
218b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
218c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
218d0 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off>=szJ );..  /
218e0 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
218f0 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
21900 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
21910 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
21920 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
21930 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
21940 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21950 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
21960 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
21970 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
21980 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
21990 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
219a0 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
219b0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
219c0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
219d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
219e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
219f0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
21a00 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  64)pSavepoint->i
21a10 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
21a20 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
21a30 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
21a40 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
21a50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
21a60 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28  alSavepointUndo(
21a70 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53  pPager->pWal, pS
21a80 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61  avepoint->aWalDa
21a90 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ta);.    }.    f
21aa0 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
21ab0 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
21ac0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70  QLITE_OK && ii<p
21ad0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20  Pager->nSubRec; 
21ae0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
21af0 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36  ert( offset==(i6
21b00 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  4)ii*(4+pPager->
21b10 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
21b20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
21b30 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
21b40 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c  pPager, &offset,
21b50 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20   pDone, 0, 1);. 
21b60 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
21b80 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
21b90 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
21ba0 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
21bb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21bc0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21bd0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
21be0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21bf0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21c00 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
21c10 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
21c20 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
21c30 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
21c40 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
21c50 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
21c60 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
21c70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
21c80 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
21c90 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
21ca0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
21cb0 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45  ** Invoke SQLITE
21cc0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
21cd0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
21ce0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73  rrent value of s
21cf0 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  zMmap..*/.static
21d00 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61   void pagerFixMa
21d10 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  plimit(Pager *pP
21d20 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54  ager){.#if SQLIT
21d30 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
21d40 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  0.  sqlite3_file
21d50 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66   *fd = pPager->f
21d60 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  d;.  if( isOpen(
21d70 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68  fd) && fd->pMeth
21d80 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
21d90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21da0 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a  int64 sz;.    sz
21db0 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61   = pPager->szMma
21dc0 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62  p;.    pPager->b
21dd0 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30  UseFetch = (sz>0
21de0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
21df0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
21e00 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
21e10 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
21e20 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65  ZE, &sz);.  }.#e
21e30 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
21e40 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
21e50 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d   size of any mem
21e60 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65  ory mapping made
21e70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21e80 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
21e90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
21ea0 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  apLimit(Pager *p
21eb0 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69  Pager, sqlite3_i
21ec0 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
21ed0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
21ee0 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72   szMmap;.  pager
21ef0 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
21f00 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  er);.}../*.** Fr
21f10 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
21f20 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
21f30 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
21f40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21f50 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
21f60 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
21f70 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
21f80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
21f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
21fa0 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65   settings of the
21fb0 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20   pager to those 
21fc0 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
21fd0 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74   pgFlags paramet
21fe0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c  er..**.** The "l
21ff0 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73  evel" in pgFlags
22000 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   & PAGER_SYNCHRO
22010 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74  NOUS_MASK sets t
22020 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a  he robustness.**
22030 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22040 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
22050 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20  o OS crashes or 
22060 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
22070 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68  y.** changing th
22080 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
22090 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
220a0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a  g the journals..
220b0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72  ** There are thr
220c0 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
220d0 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
220e0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
220f0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
22100 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
22110 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
22120 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
22130 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
22140 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
22150 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
22160 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
22170 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
22180 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
22190 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
221a0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
221b0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
221c0 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
221d0 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
221e0 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
221f0 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
22200 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
22210 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
22220 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
22230 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
22240 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
22250 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
22260 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
22270 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
22280 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
22290 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
222a0 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
222b0 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
222c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
222d0 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
222e0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
222f0 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
22300 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22310 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22320 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22330 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
22340 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
22350 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
22360 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
22370 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
22380 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
22390 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
223a0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
223c0 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
223d0 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
223e0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
223f0 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
22400 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
22410 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
22420 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
22430 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
22440 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
22450 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
22460 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
22470 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22480 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
22490 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
224a0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
224b0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
224c0 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
224d0 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
224e0 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
224f0 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
22500 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
22510 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
22520 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
22530 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
22540 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
22550 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
22560 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
22570 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
22580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
22590 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
225a0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
225b0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
225c0 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
225d0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
225e0 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
225f0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
22600 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
22610 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
22620 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
22630 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
22640 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
22650 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
22660 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
22670 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
22680 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
22690 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
226a0 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
226b0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
226c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
226d0 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44   NORMAL..**.** D
226e0 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
226f0 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
22700 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
22710 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
22720 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
22730 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
22740 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
22750 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
22760 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
22770 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
22780 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
22790 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
227a0 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
227b0 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
227c0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
227d0 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
227e0 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
227f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22800 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
22810 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
22820 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
22830 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
22840 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
22850 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
22860 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
22870 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
22880 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
22890 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
228a0 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
228b0 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
228c0 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
228d0 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
228e0 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
228f0 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
22900 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
22910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22920 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
22930 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22940 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61  erSetFlags(.  Pa
22950 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
22960 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
22970 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
22980 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e  evel for */.  un
22990 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
229a0 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
229b0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  lags */.){.  uns
229c0 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67  igned level = pg
229d0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
229e0 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a  NCHRONOUS_MASK;.
229f0 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
22a00 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
22a10 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
22a20 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
22a30 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
22a40 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
22a50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
22a60 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
22a70 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
22a80 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67  ?1:0;.  if( pPag
22a90 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
22aa0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22ab0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
22ac0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22ad0 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
22ae0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22af0 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b  GER_FULLFSYNC ){
22b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22b10 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22b20 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70  SYNC_FULL;.    p
22b30 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22b40 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22b50 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
22b60 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
22b70 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53  AGER_CKPT_FULLFS
22b80 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65  YNC ){.    pPage
22b90 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
22ba0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22bb0 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
22bc0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
22bd0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
22be0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22bf0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22c00 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22c10 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22c20 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22c30 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22c40 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RMAL;.  }.  pPag
22c50 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
22c60 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   = pPager->syncF
22c70 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67  lags;.  if( pPag
22c80 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
22c90 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
22ca0 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f  yncFlags |= WAL_
22cb0 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
22cc0 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46  S;.  }.  if( pgF
22cd0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43  lags & PAGER_CAC
22ce0 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70  HESPILL ){.    p
22cf0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
22d00 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f  l &= ~SPILLFLAG_
22d10 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OFF;.  }else{.  
22d20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
22d30 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
22d40 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  G_OFF;.  }.}.#en
22d50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
22d60 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
22d70 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
22d80 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
22d90 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
22da0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
22db0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
22dc0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
22dd0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
22de0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
22df0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
22e00 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
22e10 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
22e20 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
22e30 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
22e40 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
22e50 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
22e60 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22e70 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
22e80 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
22e90 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22ea0 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
22eb0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
22ec0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
22ed0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
22ee0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
22ef0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
22f00 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
22f10 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
22f20 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
22f30 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
22f40 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
22f50 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
22f60 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
22f70 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
22f80 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
22f90 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
22fa0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22fb0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
22fc0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
22fd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22fe0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
22ff0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
23000 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
23010 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
23020 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
23030 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
23040 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
23050 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
23060 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
23070 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
23080 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
23090 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
230a0 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
230b0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
230c0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
230d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
230f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
23100 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23110 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
23120 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
23130 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
23140 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
23150 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
23160 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
23170 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23180 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
23190 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
231a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
231b0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
231c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
231d0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
231e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
231f0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
23200 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
23210 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
23220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23230 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
23240 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
23250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
23260 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
23270 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
23280 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
23290 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
232a0 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
232b0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
232c0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
232d0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
232e0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
232f0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
23300 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
23310 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
23320 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
23330 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
23340 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
23350 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
23360 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
23370 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
23380 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
23390 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
233a0 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
233b0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
233c0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
233d0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
233e0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
233f0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
23400 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
23410 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
23430 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
23440 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
23450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23480 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
23490 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
234a0 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
234b0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
234c0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
234d0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
234e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
234f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
23500 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
23510 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
23520 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
23530 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
23540 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
23550 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
23560 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
23570 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
23580 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
23590 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
235a0 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
235b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
235c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
235d0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
235e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
235f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
23600 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
23610 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23630 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
23640 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
23650 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
23660 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
23670 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
23680 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
23690 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
236a0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
236b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
236c0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
236d0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
236e0 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  */.){.  pPager->
236f0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
23700 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
23710 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
23720 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
23730 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28  ndlerArg;..  if(
23740 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
23750 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
23760 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29  **ap = (void **)
23770 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61  &pPager->xBusyHa
23780 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72  ndler;.    asser
23790 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64  t( ((int(*)(void
237a0 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42   *))(ap[0]))==xB
237b0 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20  usyHandler );.  
237c0 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d    assert( ap[1]=
237d0 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  =pBusyHandlerArg
237e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
237f0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
23800 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
23810 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41  ITE_FCNTL_BUSYHA
23820 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61  NDLER, (void *)a
23830 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
23840 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
23850 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
23860 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
23870 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
23880 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
23890 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
238a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
238b0 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
238c0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
238d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
238e0 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
238f0 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
23900 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
23910 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
23920 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
23930 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
23940 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
23950 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
23960 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
23970 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
23980 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
23990 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
239a0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
239b0 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
239c0 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
239d0 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
239e0 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
239f0 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
23a00 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
23a10 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
23a20 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
23a30 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
23a40 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
23a50 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
23a60 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
23a70 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
23a80 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
23a90 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
23aa0 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
23ab0 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
23ac0 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
23ad0 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
23ae0 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
23af0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
23b00 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
23b10 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
23b20 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
23b30 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
23b40 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
23b50 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
23b60 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
23b70 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
23b80 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
23b90 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
23ba0 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
23bb0 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
23bc0 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
23bd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
23be0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
23bf0 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
23c00 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
23c10 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
23c20 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
23c30 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
23c40 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
23c50 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
23c60 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
23c70 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
23c80 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
23c90 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
23ca0 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
23cb0 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
23cc0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
23cd0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
23ce0 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
23cf0 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
23d00 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
23d10 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
23d20 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
23d30 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
23d40 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
23d50 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
23d60 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
23d70 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
23d80 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
23d90 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
23da0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
23db0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23dc0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
23dd0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
23de0 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
23df0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
23e00 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
23e10 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
23e20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
23e30 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
23e40 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
23e50 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
23e60 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
23e70 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
23e80 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
23e90 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
23ea0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
23eb0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
23ec0 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
23ed0 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
23ee0 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
23ef0 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
23f00 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
23f10 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
23f20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
23f30 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
23f40 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
23f50 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
23f60 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
23f70 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
23f80 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
23f90 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
23fa0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
23fb0 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
23fc0 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
23fd0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
23fe0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
23ff0 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
24000 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
24010 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
24020 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
24030 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
24040 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24050 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
24060 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
24070 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
24080 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
24090 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
240a0 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
240b0 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
240c0 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
240d0 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
240e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
240f0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
24100 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24110 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
24120 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
24130 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
24140 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
24150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24160 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
24170 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
24180 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
24190 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
241a0 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
241b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
241c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
241d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
241e0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
241f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
24200 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
24210 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
24220 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
24230 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
24240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
24260 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
24270 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
24280 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
24290 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
242a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
242b0 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28  bSize = (Pgno)((
242c0 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31  nByte+pageSize-1
242d0 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  )/pageSize);.   
242e0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
242f0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
24300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24310 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
24320 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20  (pNew);.    }.  
24330 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20  }..  *pPageSize 
24340 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
24350 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ze;.  if( rc==SQ
24360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
24370 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
24380 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
24390 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
243a0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
243b0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
243c0 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
243d0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
243e0 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
243f0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
24400 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
24410 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
24420 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
24430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24440 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
24450 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
24460 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
24470 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
24480 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
24490 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
244a0 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
244b0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
244c0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
244d0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
244e0 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
244f0 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
24500 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
24510 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
24520 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
24530 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
24540 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
24550 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
24560 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
24570 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
24580 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
24590 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
245a0 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
245b0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
245c0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
245d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
245e0 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
245f0 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
24600 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
24610 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
24620 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
24630 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
24640 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
24650 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
24660 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
24670 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
24680 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
24690 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
246a0 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
246b0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
246c0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
246d0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
246e0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
246f0 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
24700 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
24710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24720 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
24730 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24740 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
24750 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
24760 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
24770 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
24780 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24790 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
247a0 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61  EN );      /* Ca
247b0 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f  lled only by OP_
247c0 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73  MaxPgcnt */.  as
247d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
247e0 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
247f0 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d  Size );  /* OP_M
24800 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73  axPgcnt enforces
24810 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72   this */.  retur
24820 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
24830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
24840 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
24850 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24860 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
24870 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
24880 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
24890 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
248a0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
248b0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
248c0 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
248d0 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
248e0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
248f0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
24900 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
24910 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
24920 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
24930 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
24940 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
24950 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
24960 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
24970 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
24980 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
24990 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
249a0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
249b0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
249c0 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
249d0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
249e0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
249f0 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
24a00 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24a10 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
24a20 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24a30 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
24a40 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
24a50 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
24a60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24a70 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
24a80 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
24a90 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
24aa0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24ab0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
24ac0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
24ad0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
24ae0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
24af0 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
24b00 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
24b10 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
24b20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
24b30 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
24b40 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
24b50 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
24b60 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
24b70 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
24b80 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
24b90 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
24ba0 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
24bb0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
24bc0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
24bd0 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
24be0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24bf0 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
24c00 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
24c10 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
24c20 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
24c30 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
24c40 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
24c50 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
24c60 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
24c70 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
24c80 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
24c90 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
24ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
24cb0 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
24cc0 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
24cd0 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
24ce0 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
24cf0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
24d00 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
24d10 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
24d20 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
24d30 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
24d40 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
24d50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
24d60 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
24d70 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24d80 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
24d90 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
24da0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24db0 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
24dc0 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
24dd0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24de0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
24df0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  empFile );..  /*
24e00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24e10 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
24e20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c  btree immediatel
24e30 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67  y after creating
24e40 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20  .  ** the Pager 
24e50 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68  object.  There h
24e60 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f  as not been an o
24e70 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72  pportunity to tr
24e80 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  ansition.  ** to
24e90 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20   WAL mode yet.. 
24ea0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
24eb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
24ec0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f  r) );..  if( isO
24ed0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24ee0 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
24ef0 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
24f00 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
24f10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24f20 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
24f30 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
24f40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24f50 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
24f60 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
24f70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
24f80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24f90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
24fa0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
24fb0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
24fc0 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
24fd0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
24fe0 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49  .** the pager. I
24ff0 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  t returns the to
25000 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
25010 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
25020 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  ase..**.** Howev
25030 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  er, if the file 
25040 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
25050 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74   <page-size> byt
25060 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e  es in size, then
25070 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e   .** this is con
25080 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65  sidered a 1 page
25090 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
250a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
250b0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
250c0 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
250d0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
250e0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
250f0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
25100 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
25110 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
25120 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20  ER_FINISHED );. 
25130 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29   *pnPage = (int)
25140 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
25150 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
25160 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
25170 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
25180 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
25190 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
251a0 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
251b0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
251c0 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
251d0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
251e0 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
251f0 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
25200 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
25210 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
25220 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
25230 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
25240 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
25250 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
25260 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
25270 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
25280 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
25290 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
252a0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
252b0 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
252c0 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
252d0 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
252e0 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
252f0 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
25300 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
25310 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
25320 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
25330 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
25340 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
25350 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
25360 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
25370 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
25380 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
25390 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
253a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
253b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
253c0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
253d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
253e0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
253f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25420 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ode */..  /* Che
25430 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
25440 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
25450 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
25460 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
25470 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
25480 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ), or one of the
25490 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68 61   transitions tha
254a0 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
254b0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
254c0 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
254d0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
254e0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
254f0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
25500 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
25510 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25520 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d  (pPager->eLock>=
25530 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
25540 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
25550 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c  ck==NO_LOCK && l
25560 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
25570 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK).       || 
25580 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
25590 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
255a0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
255b0 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
255c0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
255d0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
255e0 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  ger, locktype);.
255f0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
25600 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
25610 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
25620 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
25630 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
25640 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25650 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
25660 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25670 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
25680 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
25690 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
256a0 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
256b0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
256c0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
256d0 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
256e0 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
256f0 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
25700 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
25710 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
25720 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
25730 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
25740 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
25750 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
25760 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
25770 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
25780 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
25790 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
257a0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
257b0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
257c0 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
257d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
257e0 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
257f0 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
25800 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
25810 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
25820 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
25830 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
25840 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
25850 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
25860 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
25870 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
25880 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
25890 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
258a0 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
258b0 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
258c0 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
258d0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
258e0 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
258f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25900 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
25910 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
25920 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
25930 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
25940 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
25950 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64  t behavior would
25960 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
25970 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
25980 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
25990 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
259a0 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
259b0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
259c0 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
259d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
259e0 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
259f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
25a00 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
25a10 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
25a20 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
25a30 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
25a40 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
25a50 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
25a60 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
25a70 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
25a80 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
25a90 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
25aa0 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
25ab0 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
25ac0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
25ad0 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
25ae0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
25af0 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
25b00 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
25b10 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
25b20 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
25b30 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
25b40 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
25b50 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
25b60 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
25b70 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
25b80 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
25b90 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
25ba0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
25bb0 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
25bc0 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
25bd0 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
25be0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25bf0 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
25c00 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
25c10 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
25c20 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
25c30 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
25c40 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
25c50 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
25c60 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
25c70 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
25c80 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
25c90 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
25ca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
25cb0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
25cc0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
25cd0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
25ce0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
25cf0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
25d00 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
25d10 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
25d20 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
25d30 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
25d40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
25d50 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
25d60 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25d70 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
25d80 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e  ansaction..** On
25d90 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ce this function
25da0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
25db0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
25dc0 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65  n must either be
25dd0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
25de0 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74  or committed. It
25df0 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
25e00 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
25e10 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63  on and.** then c
25e20 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20  ontinue writing 
25e30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
25e40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25e50 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
25e60 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
25e70 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
25e80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25e90 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
25ea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25eb0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
25ec0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
25ed0 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
25ee0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a  bSize = nPage;..
25ef0 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
25f00 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  t the code here 
25f10 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75  called assertTru
25f20 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25f30 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65  ) to.  ** ensure
25f40 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
25f50 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20  being truncated 
25f60 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65  away by this ope
25f70 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a  ration are,.  **
25f80 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
25f90 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f  savepoints are o
25fa0 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20  pen, present in 
25fb0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
25fc0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74   ** journal so t
25fd0 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
25fe0 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20  restored if the 
25ff0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c  savepoint is rol
26000 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54  led.  ** back. T
26010 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  his is no longer
26020 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
26030 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
26040 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c  ow only.  ** cal
26050 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
26060 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
26070 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c  ansaction. So al
26080 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a  though the .  **
26090 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61   Pager object ma
260a0 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65  y still have ope
260b0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61  n savepoints (Pa
260c0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d  ger.nSavepoint!=
260d0 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63  0), .  ** they c
260e0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
260f0 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73  back. So the ass
26100 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
26110 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a  raint() call.  *
26120 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63  * is no longer c
26130 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f  orrect. */.}.../
26140 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26150 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
26160 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
26170 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
26180 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e  lback. It.** syn
26190 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
261a0 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65  ile to disk, the
261b0 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a  n sets pPager->j
261c0 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65  ournalHdr to the
261d0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
261e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20  journal file so 
261f0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70  that the pager_p
26200 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
26210 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20  e knows.** that 
26220 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
26230 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
26240 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53   synced..**.** S
26250 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  yncing a hot-jou
26260 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66  rnal to disk bef
26270 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
26280 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65  o roll it back e
26290 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20  nsures .** that 
262a0 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75  if a power-failu
262b0 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  re occurs during
262c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74   the rollback, t
262d0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a  he process that.
262e0 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c  ** attempts roll
262f0 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73  back following s
26300 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73  ystem recovery s
26310 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75  ees the same jou
26320 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rnal.** content 
26330 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  as this process.
26340 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
26350 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61  hing goes as pla
26360 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  nned, SQLITE_OK 
26370 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
26380 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53  erwise, .** an S
26390 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
263a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
263b0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
263c0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
263d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
263e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
263f0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
26400 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
26410 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
26420 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
26430 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a  NC_NORMAL);.  }.
26440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26450 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
26460 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
26470 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
26480 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26490 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
264a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
264b0 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
264c0 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61  e to a memory ma
264d0 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  pped page object
264e0 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
264f0 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e   pgno. .** The n
26500 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75  ew object will u
26510 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  se the pointer p
26520 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66  Data, obtained f
26530 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a  rom xFetch()..**
26540 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
26550 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70  set *ppPage to p
26560 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
26570 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a  page reference.*
26580 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  * and return SQL
26590 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
265a0 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  e, return an SQL
265b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ite error code a
265c0 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67  nd set.** *ppPag
265d0 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  e to zero..**.**
265e0 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   Page references
265f0 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c   obtained by cal
26600 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
26610 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c  on should be rel
26620 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c  eased.** by call
26630 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65  ing pagerRelease
26640 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
26650 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
26660 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20  quireMapPage(.  
26670 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26690 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
266a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
266d0 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ber */.  void *p
266e0 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
266f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
26700 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20  ch()'d data for 
26710 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
26720 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20  gHdr **ppPage   
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26740 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20  * OUT: Acquired 
26750 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  page object */.)
26760 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26780 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
26790 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74  pped page to ret
267a0 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  urn */..  if( pP
267b0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
267c0 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ist ){.    *ppPa
267d0 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
267e0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
267f0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61      pPager->pMma
26800 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70  pFreelist = p->p
26810 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
26820 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65  irty = 0;.    me
26830 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20  mset(p->pExtra, 
26840 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
26850 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
26860 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28   *ppPage = p = (
26870 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d  PgHdr *)sqlite3M
26880 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
26890 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72  (PgHdr) + pPager
268a0 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69  ->nExtra);.    i
268b0 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( p==0 ){.     
268c0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
268d0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
268e0 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
268f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26900 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65  pData);.      re
26910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26920 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  M;.    }.    p->
26930 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a  pExtra = (void *
26940 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66  )&p[1];.    p->f
26950 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41  lags = PGHDR_MMA
26960 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  P;.    p->nRef =
26970 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65   1;.    p->pPage
26980 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a  r = pPager;.  }.
26990 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
269a0 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70  xtra==(void *)&p
269b0 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [1] );.  assert(
269c0 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a   p->pPage==0 );.
269d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
269e0 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29  gs==PGHDR_MMAP )
269f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
26a00 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
26a10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
26a20 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70  ef==1 );..  p->p
26a30 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d  gno = pgno;.  p-
26a40 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  >pData = pData;.
26a50 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
26a60 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ut++;..  return 
26a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26a80 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
26a90 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
26aa0 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
26ab0 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
26ac0 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
26ad0 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
26ae0 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
26af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b00 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
26b10 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
26b20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
26b30 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
26b40 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
26b50 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
26b60 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
26b70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
26b80 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26b90 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
26ba0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26bb0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
26bc0 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
26bd0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
26be0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
26bf0 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
26c00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
26c10 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
26c20 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
26c30 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
26c40 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
26c50 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
26c60 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
26c70 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
26c80 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
26c90 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
26ca0 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
26cb0 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
26cc0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
26cd0 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
26ce0 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
26cf0 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
26d00 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
26d10 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
26d20 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
26d30 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
26d40 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
26d50 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
26d60 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
26d70 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
26d80 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
26d90 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
26da0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
26db0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
26dc0 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
26dd0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
26de0 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
26df0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
26e00 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
26e10 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
26e20 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
26e30 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
26e40 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
26e50 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
26e60 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
26e70 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
26e80 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
26e90 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
26ea0 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
26eb0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
26ec0 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
26ed0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
26ee0 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
26ef0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
26f00 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
26f10 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
26f20 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
26f30 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
26f40 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
26f50 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
26f60 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
26f70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
26f80 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
26f90 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
26fa0 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
26fb0 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
26fc0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
26fd0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
26fe0 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
26ff0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
27000 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
27010 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
27020 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
27030 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
27040 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
27050 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
27060 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
27070 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
27080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
27090 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
270a0 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
270b0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
270c0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70  ckptSyncFlags, p
270d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
270e0 20 28 50 61 67 65 72 4f 74 61 4d 6f 64 65 28 70   (PagerOtaMode(p
270f0 50 61 67 65 72 29 3f 30 3a 70 54 6d 70 29 0a 20  Pager)?0:pTmp). 
27100 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57   );.  pPager->pW
27110 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  al = 0;.#endif. 
27120 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
27130 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
27140 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
27150 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
27160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
27170 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79  f it is open, sy
27180 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
27190 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
271a0 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  ng UnlockAndRoll
271b0 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20  back..    ** If 
271c0 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65  this is not done
271d0 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63  , then an unsync
271e0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
271f0 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a  e open journal .
27200 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20      ** file may 
27210 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
27220 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
27230 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
27240 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20  lure occurs .   
27250 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69   ** while this i
27260 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
27270 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
27280 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
27290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
272a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
272b0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
272c0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
272d0 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67  l, shift the pag
272e0 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  er.    ** into t
272f0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
27300 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f  This causes Unlo
27310 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f  ckAndRollback to
27320 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20   unlock the.    
27330 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ** database and 
27340 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
27350 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  l file without a
27360 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
27370 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b  l it.    ** back
27380 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e   or finalize it.
27390 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61   The next databa
273a0 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76  se user will hav
273b0 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72  e to do hot-jour
273c0 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  nal.    ** rollb
273d0 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73  ack before acces
273e0 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
273f0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
27400 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27410 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
27420 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
27430 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e  pPager, pagerSyn
27440 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
27450 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
27460 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
27470 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
27480 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
27490 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
274a0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
274b0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
274c0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
274d0 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
274e0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
274f0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
27500 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
27510 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
27520 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
27530 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
27540 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
27550 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
27560 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  pTmp);.  sqlite3
27570 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67  PcacheClose(pPag
27580 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23  er->pPCache);..#
27590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
275a0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61  _CODEC.  if( pPa
275b0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
275c0 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
275d0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
275e0 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  dec);.#endif..  
275f0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
27600 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21  >aSavepoint && !
27610 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
27620 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
27630 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27640 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
27650 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b  pPager->sjfd) );
27660 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
27670 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
27680 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27690 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
276a0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
276b0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
276c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
276d0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
276e0 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f  age pPg..*/.Pgno
276f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
27700 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
27710 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
27720 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64  Pg->pgno;.}.#end
27730 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
27740 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
27750 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
27760 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   pPg..*/.void sq
27770 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
27780 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
27790 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
277a0 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  Pg);.}../*.** Sy
277b0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
277c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
277d0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
277e0 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
277f0 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
27800 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
27810 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
27820 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
27830 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
27840 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73  k and can be res
27850 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  tored in the eve
27860 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  nt of a hot-jour
27870 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  nal rollback..**
27880 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72  .** If the Pager
27890 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20  .noSync flag is 
278a0 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
278b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
278c0 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
278d0 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
278e0 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
278f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
27900 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65  e and the .** de
27910 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
27920 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65  tics of the file
27930 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
27940 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
27950 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
27960 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
27970 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
27980 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
27990 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
279a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
279b0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
279c0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
279d0 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
279e0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
279f0 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
27a00 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
27a10 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
27a20 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
27a30 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
27a40 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
27a50 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
27a60 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
27a70 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
27a80 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
27a90 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
27aa0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
27ab0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
27ac0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
27ad0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
27ae0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
27af0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
27b00 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
27b10 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
27b20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
27b30 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
27b40 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
27b50 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
27b60 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
27b70 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
27b80 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
27b90 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
27ba0 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
27bb0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
27bc0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
27bd0 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
27be0 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
27bf0 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
27c00 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
27c10 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
27c20 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
27c30 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
27c40 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
27c50 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
27c60 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
27c70 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
27c80 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
27c90 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
27ca0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
27cb0 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
27cc0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
27cd0 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
27ce0 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
27cf0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
27d00 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
27d10 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
27d20 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
27d30 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
27d40 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
27d50 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
27d60 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
27d70 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a  r, int newHdr){.
27d80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27da0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
27db0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
27dc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
27dd0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
27de0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
27df0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
27e00 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
27e10 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
27e20 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
27e30 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
27e40 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
27e50 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
27e60 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
27e70 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
27e80 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
27e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27ea0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
27eb0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
27ec0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
27ed0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
27ee0 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
27ef0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27f00 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
27f10 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
27f20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
27f30 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f  MORY ){.      co
27f40 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
27f50 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
27f60 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
27f70 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
27f80 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
27f90 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
27fa0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
27fb0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
27fc0 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
27fd0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
27fe0 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
27ff0 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
28000 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
28010 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
28020 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
28030 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
28040 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
28050 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
28060 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
28070 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
28080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
28090 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
280a0 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
280b0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
280c0 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
280d0 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
280e0 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
280f0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
28100 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
28110 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
28120 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
28130 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
28140 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
28150 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
28160 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
28170 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
28180 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
28190 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
281a0 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
281b0 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
281c0 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
281d0 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
281e0 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
281f0 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
28200 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
28210 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
28220 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
28230 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
28240 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
28250 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
28260 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
28270 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
28280 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
28290 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
282a0 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
282b0 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
282c0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
282d0 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
282e0 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
282f0 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
28300 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
28310 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
28320 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
28330 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
28340 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28350 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
28360 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
28370 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28380 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
28390 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
283a0 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
283b0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
283c0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
283d0 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
283e0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
283f0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
28400 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
28410 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
28420 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
28430 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
28440 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
28450 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
28460 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
28470 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
28480 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
28490 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
284a0 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
284b0 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
284c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
284d0 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
284e0 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
284f0 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
28500 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
28510 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
28520 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
28530 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
28540 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
28550 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
28560 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
28570 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
28580 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
28590 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
285a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
285b0 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
285c0 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
285d0 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
285e0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
285f0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
28600 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
28610 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
28620 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
28630 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
28640 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
28650 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28660 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
28670 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
28680 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
28690 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
286a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
286b0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
286c0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
286d0 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
286e0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
286f0 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
28700 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
28710 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
28720 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
28730 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
28740 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
28750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28770 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
28780 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
28790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
287a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
287b0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
287c0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
287d0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
287e0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
287f0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
28800 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
28810 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
28820 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
28830 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
28840 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
28850 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
28860 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
28870 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
28880 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
28890 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
288a0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
288b0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
288c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
288d0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
288e0 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
288f0 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
28900 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
28910 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
28920 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
28930 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
28940 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
28950 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
28960 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
28970 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
28980 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
28990 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
289a0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
289b0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
289c0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
289d0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
289e0 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
289f0 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
28a00 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
28a10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28a20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
28a30 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
28a40 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
28a50 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
28a60 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28a70 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
28a80 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
28a90 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
28aa0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
28ab0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
28ac0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
28ad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28ae0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
28af0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
28b00 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
28b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28b20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b40 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
28b50 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
28b60 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
28b70 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
28b80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28b90 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
28ba0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
28bb0 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
28bc0 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
28bd0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
28be0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
28bf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28c00 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28c20 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
28c30 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
28c40 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
28c50 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
28c60 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
28c70 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
28c80 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
28c90 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
28ca0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
28cb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28cc0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
28cd0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
28ce0 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  cFlags| .       
28cf0 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
28d00 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  Flags==SQLITE_SY
28d10 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
28d20 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
28d30 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
28d40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28d50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28d60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
28d70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28d80 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
28d90 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
28da0 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d  if( newHdr && 0=
28db0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28dc0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
28dd0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
28de0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
28df0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
28e00 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
28e10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28e30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28e40 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
28e50 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28e60 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
28e70 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
28e80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65  }.  }..  /* Unle
28e90 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
28ea0 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20  in noSync mode, 
28eb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28ec0 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20   was just .  ** 
28ed0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
28ee0 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ced. Either way,
28ef0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
28f00 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
28f10 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67  on .  ** all pag
28f20 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
28f30 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
28f40 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
28f50 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65  PCache);.  pPage
28f60 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
28f70 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a  R_WRITER_DBMOD;.
28f80 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
28f90 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
28fa0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
28fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
28fc0 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
28fd0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
28fe0 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
28ff0 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
29000 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
29010 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
29020 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
29030 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
29040 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
29050 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
29060 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
29070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29080 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
29090 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
290a0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
290b0 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
290c0 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
290d0 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
290e0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
290f0 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
29100 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
29110 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
29120 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
29130 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
29140 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
29150 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
29160 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
29170 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
29180 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
29190 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
291a0 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
291b0 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
291c0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
291d0 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
291e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
291f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
29200 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
29210 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
29220 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
29230 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
29240 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
29250 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
29260 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
29270 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
29280 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
29290 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
292a0 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
292b0 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
292c0 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
292d0 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
292e0 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
292f0 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
29300 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29310 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
29320 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
29330 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
29340 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
29350 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
29360 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
29370 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
29380 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
29390 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
293a0 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
293b0 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
293c0 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
293d0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
293e0 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
293f0 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
29400 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
29410 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
29420 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
29430 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
29440 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
29450 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
29460 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
29470 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
29480 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
29490 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
294a0 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
294b0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
294c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
294d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
294e0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
294f0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
29500 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
29510 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
29520 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
29530 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
29540 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
29550 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
29560 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
29570 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
29580 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
29590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
295a0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
295b0 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ist(Pager *pPage
295c0 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29  r, PgHdr *pList)
295d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
295e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
295f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
29600 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
29610 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
29620 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
29630 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72  r rollback pager
29640 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f  s in WRITER_DBMO
29650 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73  D state. */.  as
29660 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
29670 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
29680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29690 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
296a0 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20  ITER_DBMOD );.  
296b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
296c0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
296d0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
296e0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
296f0 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
29700 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
29710 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
29720 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
29730 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
29740 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
29750 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
29760 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
29770 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
29780 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
29790 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
297a0 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
297b0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
297c0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
297d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
297e0 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
297f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
29800 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
29810 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
29820 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
29830 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
29840 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65  .  /* Before the
29850 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69   first write, gi
29860 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e  ve the VFS a hin
29870 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69  t of what the fi
29880 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69  nal.  ** file si
29890 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f  ze will be..  */
298a0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
298b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
298c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
298d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
298e0 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61  TE_OK .   && pPa
298f0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c  ger->dbHintSize<
29900 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20  pPager->dbSize. 
29910 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69    && (pList->pDi
29920 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67  rty || pList->pg
29930 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  no>pPager->dbHin
29940 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20  tSize).  ){.    
29950 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
29960 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
29970 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
29980 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
29990 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
299a0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
299b0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
299c0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
299d0 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
299e0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
299f0 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
29a00 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
29a10 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
29a20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
29a30 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
29a40 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
29a50 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
29a60 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
29a70 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
29a80 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
29a90 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
29aa0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
29ab0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
29ac0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
29ad0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
29ae0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
29af0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
29b00 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
29b10 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
29b20 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
29b30 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
29b40 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
29b50 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
29b60 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
29b70 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
29b80 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
29b90 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
29ba0 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
29bb0 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
29bc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
29bd0 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
29be0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
29bf0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
29c00 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
29c10 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
29c20 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
29c30 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
29c40 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
29c50 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
29c60 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
29c70 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
29c80 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ca0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
29cb0 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
29cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
29cd0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
29ce0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
29cf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
29d00 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
29d10 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
29d20 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
29d30 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
29d40 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
29d50 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
29d60 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
29d70 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
29d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
29d90 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  M, pData);..    
29da0 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
29db0 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
29dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29dd0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
29de0 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
29df0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
29e00 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
29e10 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
29e20 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
29e30 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
29e40 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
29e50 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
29e60 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
29e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29e80 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
29e90 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
29ea0 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
29eb0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
29ec0 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
29ed0 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
29ee0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
29ef0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
29f00 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
29f10 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
29f20 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
29f30 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
29f40 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
29f50 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
29f60 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
29f70 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
29f80 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
29f90 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
29fa0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
29fb0 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
29fc0 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ]++;..      /* U
29fd0 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
29fe0 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
29ff0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2a000 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
2a010 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
2a020 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
2a030 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
2a040 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
2a050 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
2a060 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
2a070 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
2a080 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
2a090 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
2a0a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
2a0b0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
2a0c0 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
2a0d0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
2a0e0 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
2a0f0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
2a100 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
2a110 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2a120 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d  db_count);.    }
2a130 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
2a140 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45  RTRACE(("NOSTORE
2a150 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2a160 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2a170 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20   pgno));.    }. 
2a180 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
2a190 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20  ehash(pList);.  
2a1a0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
2a1b0 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20  >pDirty;.  }..  
2a1c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a1d0 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
2a1e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2a1f0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66  file is open. If
2a200 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
2a210 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  pen, this .** fu
2a220 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2a230 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
2a240 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
2a250 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
2a260 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  s according to p
2a270 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49  lan. An .** SQLI
2a280 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
2a290 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2a2a0 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ned if a call to
2a2b0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
2a2c0 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73   .** fails..*/.s
2a2d0 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
2a2e0 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
2a2f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2a300 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a310 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2a320 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2a330 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2a340 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2a350 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2a360 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
2a370 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2a380 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
2a390 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
2a3a0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
2a3b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2a3c0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
2a3d0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
2a3e0 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
2a3f0 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
2a400 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a410 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
2a420 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20  end a record of 
2a430 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
2a440 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f  e of page pPg to
2a450 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a460 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  . .** It is the 
2a470 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
2a480 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75  bility to use su
2a490 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
2a4a0 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68   to check .** th
2a4b0 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  at it is really 
2a4c0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
2a4d0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
2a4e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
2a4f0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
2a500 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
2a510 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
2a520 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
2a530 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
2a540 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
2a550 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2a560 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2a570 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2a580 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
2a590 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2a5a0 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
2a5b0 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
2a5c0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
2a5d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a5e0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
2a5f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2a600 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
2a610 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
2a620 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
2a630 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
2a640 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2a650 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
2a660 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
2a670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
2a680 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2a690 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2a6a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a6b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2a6c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a  NALMODE_OFF ){..
2a6d0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
2a6e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
2a6f0 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
2a700 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a  dy been opened *
2a710 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2a720 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2a730 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a740 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2a750 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57  fd) || pagerUseW
2a760 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2a770 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2a780 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2a790 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  | pPager->nSubRe
2a7a0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2a7b0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
2a7c0 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
2a7d0 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e    || pageInJourn
2a7e0 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 20  al(pPager, pPg) 
2a7f0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
2a800 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2a810 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
2a820 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
2a830 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2a840 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2a850 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
2a860 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
2a870 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
2a880 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
2a890 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
2a8a0 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
2a8b0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
2a8c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a8d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
2a8e0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
2a8f0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
2a900 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
2a910 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  )pPager->nSubRec
2a920 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
2a930 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
2a940 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20  r *pData2;.  .  
2a950 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2a960 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2a970 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2a980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
2a990 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45  ta2);.      PAGE
2a9a0 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
2a9b0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
2a9c0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2a9d0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2a9e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
2a9f0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
2aa00 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
2aa10 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2aa20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2aa30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2aa40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2aa50 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
2aa60 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
2aa70 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
2aa80 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
2aa90 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2aaa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2aab0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
2aac0 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ec++;.    assert
2aad0 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2aae0 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63  oint>0 );.    rc
2aaf0 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   = addToSavepoin
2ab00 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
2ab10 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
2ab20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ab30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2ab40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2ab50 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
2ab60 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
2ab70 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
2ab80 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
2ab90 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
2aba0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
2abb0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
2abc0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
2abd0 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
2abe0 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
2abf0 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
2ac00 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
2ac10 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
2ac20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
2ac30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ac40 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
2ac50 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
2ac60 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
2ac70 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2ac80 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
2ac90 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
2aca0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2acb0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
2acc0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
2acd0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
2ace0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
2acf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2ad00 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
2ad10 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
2ad20 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
2ad30 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2ad40 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
2ad50 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
2ad60 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
2ad70 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2ad80 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
2ad90 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
2ada0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2adb0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
2adc0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
2add0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2ade0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2adf0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2ae00 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
2ae10 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
2ae20 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2ae30 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2ae40 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
2ae50 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
2ae60 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
2ae70 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
2ae80 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2ae90 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
2aea0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
2aeb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2aec0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
2aed0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
2aee0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
2aef0 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
2af00 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2af10 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
2af20 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
2af30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2af40 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
2af50 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
2af60 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
2af70 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
2af80 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
2af90 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62  otSpill NOSYNC b
2afa0 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  it is set during
2afb0 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
2afc0 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
2afd0 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
2afe0 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
2aff0 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
2b000 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
2b010 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
2b020 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
2b030 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
2b040 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
2b050 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
2b060 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
2b070 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
2b080 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
2b090 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c   doNotSpill ROLL
2b0a0 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74  BACK and OFF bit
2b0b0 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  s inhibits all c
2b0c0 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20  ache spilling.  
2b0d0 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ** regardless of
2b0e0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2b0f0 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
2b100 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
2b110 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72   during.  ** a r
2b120 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73  ollback or by us
2b130 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70  er request, resp
2b140 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20  ectively..  **. 
2b150 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20   ** Spilling is 
2b160 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20  also prohibited 
2b170 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
2b180 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61   state since tha
2b190 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61  t could.  ** lea
2b1a0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
2b1b0 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74  rruption.   In t
2b1c0 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
2b1d0 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20  mentation it .  
2b1e0 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
2b1f0 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
2b200 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
2b210 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
2b220 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77  teFlag==3.  ** w
2b230 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
2b240 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
2b250 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
2b260 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
2b270 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
2b280 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
2b290 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
2b2a0 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
2b2b0 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
2b2c0 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
2b2d0 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
2b2e0 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
2b2f0 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
2b300 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2b310 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2b320 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2b330 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65  E_OK;.  testcase
2b340 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b350 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b360 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74  _ROLLBACK );.  t
2b370 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b380 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b390 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20  ILLFLAG_OFF );. 
2b3a0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2b3b0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2b3c0 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
2b3d0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2b3e0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20  ->doNotSpill.   
2b3f0 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e  && ((pPager->doN
2b400 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c  otSpill & (SPILL
2b410 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50  FLAG_ROLLBACK|SP
2b420 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30  ILLFLAG_OFF))!=0
2b430 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
2b440 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
2b450 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29  ED_SYNC)!=0).  )
2b460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b470 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2b480 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
2b490 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
2b4a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
2b4b0 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2b4c0 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2b4d0 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2b4e0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  g. */.    if( su
2b4f0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2b500 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63  Pg) ){ .      rc
2b510 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
2b520 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20  e(pPg); .    }. 
2b530 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b540 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2b550 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2b560 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2b570 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2b580 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
2b590 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2b5a0 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2b5b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2b5c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2b5d0 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2b5e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2b5f0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2b600 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2b610 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2b620 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2b630 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2b640 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
2b650 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
2b660 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2b670 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2b680 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
2b690 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
2b6a0 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
2b6b0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2b6c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
2b6d0 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
2b6e0 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
2b6f0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2b700 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
2b710 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
2b720 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
2b730 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
2b740 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
2b750 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
2b760 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
2b770 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
2b780 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
2b790 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
2b7a0 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
2b7b0 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2b7c0 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
2b7d0 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
2b7e0 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
2b7f0 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
2b800 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2b810 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
2b820 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
2b830 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
2b840 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
2b850 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
2b860 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
2b870 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
2b880 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
2b890 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
2b8a0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
2b8b0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2b8c0 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
2b8d0 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
2b8e0 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
2b8f0 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
2b900 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
2b910 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
2b920 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
2b930 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
2b940 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
2b950 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b960 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
2b970 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
2b980 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
2b990 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
2b9a0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
2b9b0 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
2b9c0 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
2b9d0 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
2b9e0 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
2b9f0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
2ba00 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
2ba10 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
2ba20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
2ba30 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
2ba40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
2ba50 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
2ba60 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
2ba70 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
2ba80 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
2ba90 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
2baa0 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
2bab0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
2bac0 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
2bad0 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
2bae0 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
2baf0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
2bb00 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
2bb10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2bb20 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2bb30 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
2bb40 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
2bb50 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2bb60 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2bb70 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
2bb80 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
2bb90 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2bba0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2bbb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bbc0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2bbd0 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
2bbe0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2bbf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
2bc00 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2bc10 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50  elist(pPager, pP
2bc20 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
2bc30 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2bc40 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
2bc50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bc60 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
2bc70 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
2bc80 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2bc90 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2bca0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
2bcb0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2bcc0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
2bcd0 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2bce0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2bcf0 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ); .}.../*.** Al
2bd00 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2bd10 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
2bd20 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
2bd30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2bd40 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
2bd50 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
2bd60 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
2bd70 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
2bd80 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
2bd90 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
2bda0 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
2bdb0 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
2bdc0 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
2bdd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2bde0 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
2bdf0 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
2be00 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
2be10 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
2be20 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
2be30 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
2be40 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
2be50 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
2be60 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
2be70 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
2be80 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
2be90 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
2bea0 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
2beb0 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
2bec0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
2bed0 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
2bee0 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
2bef0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
2bf00 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2bf10 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
2bf20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2bf30 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
2bf40 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
2bf50 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
2bf60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2bf70 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
2bf80 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
2bf90 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
2bfa0 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
2bfb0 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
2bfc0 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
2bfd0 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
2bfe0 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
2bff0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
2c000 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
2c010 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
2c020 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
2c030 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
2c040 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
2c050 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
2c060 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
2c070 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
2c080 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a  * of the PAGER_*
2c090 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
2c0a0 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
2c0b0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
2c0c0 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
2c0d0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2c0e0 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
2c0f0 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
2c100 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
2c110 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
2c120 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
2c130 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
2c140 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2c150 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2c160 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
2c170 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
2c180 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2c190 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
2c1a0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
2c1b0 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
2c1c0 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
2c1d0 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
2c1e0 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
2c1f0 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
2c200 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
2c210 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2c220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2c230 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
2c240 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
2c250 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
2c260 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
2c270 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
2c280 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
2c290 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
2c2a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2c2b0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2c2c0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
2c2d0 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
2c2e0 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
2c2f0 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
2c300 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
2c310 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
2c320 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2c330 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2c340 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2c350 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
2c360 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c370 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2c380 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
2c390 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2c3a0 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
2c3b0 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2c3c0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
2c3d0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2c3e0 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
2c3f0 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
2c400 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
2c410 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
2c420 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
2c430 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
2c440 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
2c450 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2c460 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
2c470 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
2c480 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
2c490 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
2c4a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2c4b0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
2c4c0 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
2c4d0 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
2c4e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
2c4f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2c500 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2c510 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
2c520 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2c530 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
2c540 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
2c550 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
2c560 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
2c570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2c580 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2c590 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
2c5a0 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
2c5b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2c5c0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2c5d0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
2c5e0 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
2c5f0 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
2c600 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2c610 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
2c620 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
2c630 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
2c640 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
2c650 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
2c660 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
2c670 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2c680 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2c690 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
2c6a0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
2c6b0 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
2c6c0 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
2c6d0 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
2c6e0 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
2c6f0 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  l */.  int pcach
2c700 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
2c710 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
2c720 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2c730 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
2c740 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61  he */.  u32 szPa
2c750 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2c760 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2c770 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
2c780 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f  age size */.  co
2c790 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d  nst char *zUri =
2c7a0 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72   0;    /* URI ar
2c7b0 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  gs to copy */.  
2c7c0 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20  int nUri = 0;   
2c7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c7e0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55  er of bytes of U
2c7f0 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69  RI args at *zUri
2c800 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
2c810 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
2c820 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
2c830 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2c840 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
2c850 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
2c860 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
2c870 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
2c880 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
2c890 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
2c8a0 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
2c8b0 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
2c8c0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
2c8d0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
2c8e0 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
2c8f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
2c900 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
2c910 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
2c920 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
2c930 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
2c940 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
2c950 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
2c960 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
2c970 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
2c980 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
2c990 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
2c9a0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2c9b0 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
2c9c0 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
2c9d0 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
2c9e0 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
2c9f0 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
2ca00 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2ca10 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
2ca20 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2ca30 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2ca40 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
2ca50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
2ca60 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2ca70 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
2ca80 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
2ca90 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2caa0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2cab0 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2cac0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2cad0 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2cae0 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2caf0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2cb00 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2cb10 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2cb20 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2cb30 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
2cb40 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2cb50 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68  ] ){.      zPath
2cb60 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2cb70 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e  StrDup(0, zFilen
2cb80 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2cb90 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20  zPathname==0  ) 
2cba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2cbb0 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74 68  MEM;.      nPath
2cbc0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2cbd0 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2cbe0 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  );.      zFilena
2cbf0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
2cc00 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
2cc10 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
2cc20 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2cc30 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
2cc40 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
2cc50 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
2cc60 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
2cc70 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
2cc80 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
2cc90 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
2cca0 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
2ccb0 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
2ccc0 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
2ccd0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2cce0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2ccf0 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
2cd00 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74  har *z;.    nPat
2cd10 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
2cd20 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
2cd30 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2cd40 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
2cd50 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  , nPathname*2);.
2cd60 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2cd70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2cd80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2cd90 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  M;.    }.    zPa
2cda0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2cdb0 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2cdc0 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2cdd0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2cde0 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2cdf0 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2ce00 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2ce10 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2ce20 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2ce30 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2ce40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ce50 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2ce60 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2ce70 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2ce80 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2ce90 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2cea0 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2ceb0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2cec0 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2ced0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2cee0 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2cef0 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a   nUri = (int)(&z
2cf00 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20  [1] - zUri);.   
2cf10 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30   assert( nUri>=0
2cf20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
2cf30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
2cf40 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
2cf50 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
2cf60 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2cf70 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
2cf80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
2cf90 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2cfa0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2cfb0 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
2cfc0 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
2cfd0 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
2cfe0 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
2cff0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
2d000 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
2d010 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
2d020 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
2d030 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
2d040 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
2d050 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2d060 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
2d070 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
2d080 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
2d090 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
2d0a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2d0b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2d0c0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2d0d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d0e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2d0f0 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d100 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2d110 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2d120 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2d130 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2d140 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2d150 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2d160 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2d170 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2d180 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2d190 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2d1a0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2d1b0 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2d1c0 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2d1d0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2d1e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2d1f0 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2d200 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2d210 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2d220 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2d230 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2d240 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2d250 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2d260 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d270 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2d280 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2d290 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2d2a0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d2b0 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2d2c0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2d2d0 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2d2e0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2d2f0 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2d300 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d310 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2d320 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2d330 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2d340 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2d350 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2d360 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2d370 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2d380 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2d390 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2d3a0 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2d3b0 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2d3c0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2d3d0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2d3e0 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2d3f0 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2d400 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2d410 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2d420 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2d430 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2d440 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2d450 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2d460 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2d470 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2d480 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2d490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d4a0 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2d4b0 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2d4c0 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20  name + 1 + nUri 
2d4d0 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69  +         /* zFi
2d4e0 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2d4f0 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20  athname + 8 + 2 
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d510 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2d520 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d530 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2d540 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20  ame + 4 + 2     
2d550 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2d560 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2d570 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2d580 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2d590 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2d5a0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2d5b0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2d5c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2d5d0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2d5e0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2d5f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2d600 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2d610 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2d620 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2d630 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2d640 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2d650 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2d660 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2d670 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2d680 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d690 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2d6a0 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2d6b0 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2d6c0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2d6d0 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2d6e0 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2d6f0 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2d700 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d710 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2d720 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2d730 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2d740 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2d750 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2d760 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d770 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d780 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2d790 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2d7a0 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2d7b0 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2d7c0 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2d7d0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2d7e0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2d7f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2d800 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2d810 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2d820 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2d830 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2d840 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2d850 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d860 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2d870 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2d880 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2d890 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d8a0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2d8b0 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2d8c0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2d8d0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2d8e0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2d8f0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2d900 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2d910 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2d920 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2d930 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2d940 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2d950 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d960 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2d970 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2d980 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2d990 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2d9a0 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2d9b0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2d9c0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2d9d0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2d9e0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d9f0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2da00 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2da10 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2da20 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2da30 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2da40 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2da50 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2da60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2da70 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2da80 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2da90 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2daa0 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2dab0 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2dac0 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2dad0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2dae0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2daf0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2db00 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2db10 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2db20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2db30 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2db40 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2db50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2db60 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2db70 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2db80 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2db90 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2dba0 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2dbb0 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  b );.    readOnl
2dbc0 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2dbd0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2dbe0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2dbf0 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2dc00 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2dc10 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2dc20 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2dc30 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2dc40 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2dc50 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2dc60 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2dc70 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2dc80 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2dc90 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2dca0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2dcb0 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2dcc0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2dcd0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2dce0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2dcf0 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2dd00 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2dd10 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2dd20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2dd30 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2dd40 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2dd50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2dd60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dd70 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2dd80 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2dd90 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2dda0 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >fd);.      if( 
2ddb0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2ddc0 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
2ddd0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
2dde0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2ddf0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2de00 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
2de10 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2de20 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  E);.        if( 
2de30 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
2de40 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
2de50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2de60 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2de70 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
2de80 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
2de90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2dea0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2deb0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2dec0 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2ded0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dee0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2def0 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2df00 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2df10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2df20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2df30 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2df40 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
2df50 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
2df60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2df70 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2df80 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2df90 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2dfa0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2dfb0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
2dfc0 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
2dfd0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2dfe0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2dff0 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2e000 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2e010 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2e020 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2e030 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2e040 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2e050 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
2e060 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2e070 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50               szP
2e090 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
2e0a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e0c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
2e0d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
2e0e0 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  oLock = sqlite3_
2e0f0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2e100 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c  ename, "nolock",
2e110 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28   0);.      if( (
2e120 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43  iDc & SQLITE_IOC
2e130 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30  AP_IMMUTABLE)!=0
2e140 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
2e150 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2e160 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74  Filename, "immut
2e170 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20  able", 0) ){.   
2e180 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20         vfsFlags 
2e190 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
2e1a0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
2e1b0 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65     goto act_like
2e1c0 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20  _temp_file;.    
2e1d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2e1e0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2e1f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2e200 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2e210 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2e220 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2e230 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2e240 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2e250 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2e260 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2e270 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2e280 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2e290 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2e2a0 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2e2b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2e2c0 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2e2d0 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2e2e0 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2e2f0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2e300 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2e310 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2e320 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2e330 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2e340 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2e350 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2e360 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2e370 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rnal..    **.   
2e380 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2e390 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69  also runs for fi
2e3a0 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d  les marked as im
2e3b0 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20  mutable..    */ 
2e3c0 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66  .act_like_temp_f
2e3d0 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c  ile:.    tempFil
2e3e0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
2e3f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2e400 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a  R_READER;     /*
2e410 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65   Pretend we alre
2e420 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20  ady have a lock 
2e430 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
2e440 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2e450 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65  _LOCK;    /* Pre
2e460 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45  tend we are in E
2e470 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67  XCLUSIVE locking
2e480 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61   mode */.    pPa
2e490 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b  ger->noLock = 1;
2e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4b0 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67  /* Do no locking
2e4c0 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   */.    readOnly
2e4d0 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c   = (vfsFlags&SQL
2e4e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e4f0 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  Y);.  }..  /* Th
2e500 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
2e510 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65   to PagerSetPage
2e520 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f  size() serves to
2e530 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
2e540 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61  f .  ** Pager.pa
2e550 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c  geSize and to al
2e560 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
2e570 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
2e580 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
2e590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e5a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e5b0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20  r->memDb==0 );. 
2e5c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e5d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2e5e0 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44  pPager, &szPageD
2e5f0 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  flt, -1);.    te
2e600 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
2e610 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
2e620 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
2e630 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
2e640 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2e650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2e660 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
2e670 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72 61  00 );.    nExtra
2e680 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2e690 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e6a0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2e6b0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2e6c0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6e0 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2e6f0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2e700 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2e710 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
2e720 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
2e730 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  or occurred abov
2e740 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67  e, free the  Pag
2e750 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2e760 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2e770 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2e780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e790 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2e7a0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2e7b0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
2e7c0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
2e7d0 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
2e7e0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2e7f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e800 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2e810 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
2e820 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
2e830 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
2e840 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
2e850 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
2e860 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
2e870 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
2e880 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
2e890 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
2e8a0 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
2e8b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e8c0 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
2e8d0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
2e8e0 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
2e8f0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
2e900 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e910 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
2e920 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e930 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
2e940 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e950 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
2e960 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
2e970 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
2e980 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
2e990 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2e9a0 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
2e9b0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2e9c0 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2e9d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2e9e0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2e9f0 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2ea00 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2ea10 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2ea20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2ea30 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2ea40 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2ea50 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2ea60 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2ea70 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2ea80 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2ea90 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2eaa0 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2eab0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2eac0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2ead0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2eae0 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2eaf0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2eb00 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2eb10 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2eb20 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2eb30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2eb40 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2eb50 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2eb60 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
2eb70 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2eb80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eb90 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
2eba0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ebb0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2ebc0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ebd0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2ebe0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2ebf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ec00 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30  ckptSyncFlags==0
2ec10 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2ec20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2ec30 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
2ec40 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
2ec50 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2ec60 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  L;.    pPager->w
2ec70 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  alSyncFlags = SQ
2ec80 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2ec90 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e   | WAL_SYNC_TRAN
2eca0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50  SACTIONS;.    pP
2ecb0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2ecc0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2ecd0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
2ece0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2ecf0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2ed00 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2ed10 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2ed20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2ed30 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2ed40 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2ed50 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2ed60 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2ed70 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2ed80 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2ed90 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2eda0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2edb0 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2edc0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2edd0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2ede0 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2edf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2ee00 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2ee10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2ee20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
2ee30 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
2ee40 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2ee50 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2ee60 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
2ee70 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
2ee80 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
2ee90 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
2eea0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
2eeb0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2eec0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
2eed0 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
2eee0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2eef0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2ef00 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
2ef10 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  /* pPager->szMma
2ef20 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  p = SQLITE_DEFAU
2ef30 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20  LT_MMAP_SIZE // 
2ef40 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62  will be set by b
2ef50 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70  tree.c */..  *pp
2ef60 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
2ef70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ef80 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66  OK;.}.../* Verif
2ef90 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
2efa0 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ase file has not
2efb0 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72   be deleted or r
2efc0 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a  enamed out from.
2efd0 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61 67  ** under the pag
2efe0 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
2eff0 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74  TE_OK if the dat
2f000 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  abase is still w
2f010 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20  ere it ought.** 
2f020 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20  to be on disk.  
2f030 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
2f040 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  (SQLITE_READONLY
2f050 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65  _DBMOVED or some
2f060 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
2f070 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
2f080 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66 20  3OsAccess()) if 
2f090 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
2f0a0 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a   gone missing..*
2f0b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74  /.static int dat
2f0c0 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50  abaseIsUnmoved(P
2f0d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2f0e0 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d   int bHasMoved =
2f0f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
2f100 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
2f110 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  pFile ) return S
2f120 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2f130 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
2f140 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2f150 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
2f160 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2f170 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69  e && pPager->zFi
2f180 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72  lename[0] );.  r
2f190 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
2f1a0 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
2f1b0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
2f1c0 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48  L_HAS_MOVED, &bH
2f1d0 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20  asMoved);.  if( 
2f1e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
2f1f0 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  UND ){.    /* If
2f200 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66   the HAS_MOVED f
2f210 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75  ile-control is u
2f220 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73  nimplemented, as
2f230 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
2f240 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  le.    ** has no
2f250 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54  t been moved.  T
2f260 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74 6f  hat is the histo
2f270 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f  rical behavior o
2f280 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20  f SQLite: prior 
2f290 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  to.    ** versio
2f2a0 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65  n 3.8.3, it neve
2f2b0 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20  r checked */.   
2f2c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f2d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2f2e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48  =SQLITE_OK && bH
2f2f0 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72  asMoved ){.    r
2f300 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
2f310 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d  NLY_DBMOVED;.  }
2f320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f330 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2f340 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2f350 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
2f360 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
2f370 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
2f380 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
2f390 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
2f3a0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
2f3b0 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
2f3c0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2f3d0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
2f3e0 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
2f3f0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
2f400 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
2f410 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
2f420 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
2f430 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
2f440 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
2f450 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
2f460 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
2f470 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
2f480 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2f490 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
2f4a0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
2f4b0 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
2f4c0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2f4d0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2f4e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2f4f0 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
2f500 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
2f510 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
2f520 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2f530 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
2f540 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2f550 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
2f560 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2f570 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
2f580 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
2f590 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2f5a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f5b0 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
2f5c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2f5d0 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
2f5e0 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
2f5f0 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
2f600 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
2f610 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
2f620 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
2f630 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2f640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f650 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
2f660 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
2f670 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2f680 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2f690 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2f6a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
2f6b0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
2f6c0 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
2f6d0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
2f6e0 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
2f6f0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2f700 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2f710 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
2f720 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2f730 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
2f740 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
2f750 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
2f760 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
2f770 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
2f780 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
2f790 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
2f7a0 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
2f7b0 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
2f7c0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
2f7d0 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
2f7e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2f7f0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
2f800 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
2f810 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
2f820 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
2f830 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
2f840 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
2f850 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2f860 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
2f870 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2f880 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
2f890 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
2f8a0 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
2f8b0 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2f8c0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2f8d0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2f8e0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2f8f0 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
2f900 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
2f910 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
2f920 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
2f930 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
2f940 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2f950 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
2f960 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
2f970 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2f980 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
2f990 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2f9a0 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
2f9b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2f9c0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2f9d0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
2f9e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f9f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
2fa00 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2fa10 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
2fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fa30 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
2fa40 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2fa50 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
2fa60 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
2fa70 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
2fa80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fa90 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2faa0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2fab0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2fac0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fad0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2fae0 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  PEN );..  assert
2faf0 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ( jrnlOpen==0 ||
2fb00 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   ( sqlite3OsDevi
2fb10 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2fb20 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  s(pPager->jfd) &
2fb30 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41  .    SQLITE_IOCA
2fb40 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
2fb50 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20  EN_OPEN.  ));.. 
2fb60 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
2fb70 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2fb80 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2fb90 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
2fba0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2fbb0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2fbc0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
2fbd0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2fbe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
2fbf0 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
2fc00 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20  locked = 0;     
2fc10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fc20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
2fc30 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2fc40 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
2fc50 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
2fc60 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
2fc70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
2fc80 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
2fc90 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
2fca0 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
2fcb0 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
2fcc0 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
2fcd0 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
2fce0 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
2fcf0 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
2fd00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
2fd10 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
2fd20 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
2fd30 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
2fd40 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
2fd50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2fd60 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
2fd70 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
2fd80 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
2fd90 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
2fda0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2fdb0 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
2fdc0 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
2fdd0 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
2fde0 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
2fdf0 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
2fe00 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
2fe10 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
2fe20 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
2fe30 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
2fe40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2fe50 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
2fe60 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
2fe70 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
2fe80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2fe90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
2fea0 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ked ){.      Pgn
2feb0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
2fec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fed0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2fee0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2fef0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2ff00 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2ff10 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2ff20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ff30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2ff40 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2ff50 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20  e is zero pages 
2ff60 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65  in size, that me
2ff70 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
2ff80 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20  (1) the.        
2ff90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20  ** journal is a 
2ffa0 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70  remnant from a p
2ffb0 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69  rior database wi
2ffc0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
2ffd0 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a   where.        *
2ffe0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2fff0 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20  ile but not the 
30000 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65  journal was dele
30010 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20  ted, or (2) the 
30020 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20  initial.        
30030 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
30040 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20  hat populates a 
30050 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
30060 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
30070 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  k..        ** In
30080 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
30090 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
300a0 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  an be deleted.  
300b0 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61  However, take ca
300c0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  re.        ** no
300d0 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
300e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
300f0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
30100 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20  en due to.      
30110 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64    ** journal_mod
30120 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20  e=PERSIST..     
30130 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
30140 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a  ( nPage==0 && !j
30150 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
30160 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
30170 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
30180 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
30190 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
301a0 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
301b0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
301c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
301d0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
301e0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
301f0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
30200 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
30210 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
30220 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
30230 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
30240 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
30250 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30260 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
30270 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
30280 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
30290 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
302a0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
302b0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
302c0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
302d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
302e0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
302f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30300 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
30310 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
30320 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
30330 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
30340 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
30350 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
30360 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
30370 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
30380 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
30390 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
303a0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
303b0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
303c0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
303d0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
303e0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
303f0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
30400 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
30410 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
30420 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
30430 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
30440 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30450 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
30460 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
30470 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
30480 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
30490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
304a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
304b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
304c0 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
304d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
304e0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
304f0 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
30500 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
30510 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
30530 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
30540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
30550 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30570 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
30580 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
305a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
305b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
305c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
305d0 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
305e0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
305f0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
30600 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
30610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
30620 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
30630 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
30640 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
30650 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
30660 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
30670 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
30680 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
30690 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
306a0 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
306b0 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
306c0 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
306d0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
306e0 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
306f0 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
30700 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
30710 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
30720 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
30730 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
30740 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
30750 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
30760 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
30770 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
30780 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
30790 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
307a0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
307b0 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
307c0 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
307d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
307e0 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
307f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
30800 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
30810 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
30820 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
30830 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
30840 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
30850 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30860 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
30870 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
30880 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30890 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
308a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
308b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
308c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
308d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
308e0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
308f0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
30900 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30910 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ile..** It is il
30920 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71  legal to call sq
30930 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
30940 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20  e() until after 
30950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
30960 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
30970 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49  sfully called. I
30980 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  f a shared-lock 
30990 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
309a0 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
309b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
309c0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
309d0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
309e0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ing operations a
309f0 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65  re also performe
30a00 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
30a10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  on..**.**   1) I
30a20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
30a30 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
30a40 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f  R_OPEN state (no
30a50 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
30a60 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
30a70 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
30a80 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
30a90 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
30aa0 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
30ab0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
30ac0 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
30ad0 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
30ae0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
30af0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
30b00 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
30b10 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
30b20 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
30b30 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
30b40 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
30b50 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
30b60 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
30b70 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
30b80 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30b90 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
30ba0 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
30bb0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
30bc0 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
30bd0 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
30be0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
30bf0 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
30c00 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
30c10 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
30c20 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
30c30 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
30c40 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
30c50 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
30c60 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
30c70 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
30c80 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
30c90 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
30ca0 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
30cb0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
30cc0 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
30cd0 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
30ce0 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
30cf0 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
30d00 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
30d10 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
30d20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
30d30 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
30d40 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
30d50 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
30d60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
30d70 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
30d80 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
30d90 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
30da0 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
30db0 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
30dc0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
30dd0 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
30de0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
30df0 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67  e or .** rolling
30e00 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
30e10 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72  file, the IO err
30e20 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
30e30 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
30e40 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
30e50 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
30e60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
30e70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30e80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30e90 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
30ea0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
30eb0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
30ec0 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79   b-tree and only
30ed0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
30ee0 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64  no.  ** outstand
30ef0 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
30f00 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
30f10 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68 6f   pager state sho
30f20 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20  uld either.  ** 
30f30 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45  be OPEN or READE
30f40 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c  R. READER is onl
30f50 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68  y possible if th
30f60 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77 61  e pager is or wa
30f70 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75  s in .  ** exclu
30f80 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
30f90 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30fa0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
30fb0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
30fc0 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
30fd0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
30fe0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
30ff0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
31000 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
31010 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
31020 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31030 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
31040 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20  if( NEVER(MEMDB 
31050 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
31060 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50  de) ){ return pP
31070 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d  ager->errCode; }
31080 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
31090 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
310a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
310b0 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
310c0 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61    int bHotJourna
310d0 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
310e0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
310f0 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f   exists a hot jo
31100 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20  urnal-file */.. 
31110 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
31120 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  B );..    rc = p
31130 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
31140 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
31150 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
31160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31180 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
31190 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
311a0 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
311b0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f  LOCK );.      go
311c0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
311d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
311e0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
311f0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
31200 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
31210 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
31220 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
31230 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
31240 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
31250 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
31260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31270 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
31280 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
31290 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
312a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
312b0 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
312c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
312d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
312e0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
312f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
31300 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
31310 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72     if( pPager->r
31320 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
31330 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
31340 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
31350 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
31360 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
31370 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
31380 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
31390 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
313a0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
313b0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
313c0 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
313d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
313e0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
313f0 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
31400 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
31410 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
31420 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
31430 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
31440 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
31450 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
31460 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
31470 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
31480 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
31490 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
314a0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
314b0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
314c0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
314d0 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
314e0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
314f0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
31500 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
31510 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
31520 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
31530 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
31540 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
31550 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
31560 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
31570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31580 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
31590 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
315a0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
315b0 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
315c0 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
315d0 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
315e0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
315f0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
31600 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
31610 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
31620 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
31630 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
31640 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20  the lock is.    
31650 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20    ** downgraded 
31660 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62  to SHARED_LOCK b
31670 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
31680 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20  ion returns..   
31690 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
316a0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
316b0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
316c0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
316d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
316e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
316f0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  iled;.      }. .
31700 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
31710 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
31720 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  en and the file 
31730 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
31740 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  open the .      
31750 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  ** journal for r
31760 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
31770 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69  . Write access i
31780 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
31790 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  se .      ** in 
317a0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
317b0 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
317c0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
317d0 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20  e kept open .   
317e0 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62     ** and possib
317f0 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
31800 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
31810 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d  on. Also, write-
31820 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  access .      **
31830 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75   is usually requ
31840 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ired to finalize
31850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   the journal in 
31860 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72  journal_mode=per
31870 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  sist .      ** m
31880 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f  ode (and also fo
31890 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74  r journal_mode=t
318a0 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20  runcate on some 
318b0 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20  systems)..      
318c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
318d0 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
318e0 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
318f0 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
31900 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20   some .      ** 
31910 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
31920 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
31930 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
31940 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
31950 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
31960 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
31970 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
31980 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
31990 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
319a0 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
319b0 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
319c0 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
319d0 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
319e0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
319f0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
31a00 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
31a10 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
31a20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
31a30 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
31a40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
31a50 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
31a60 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
31a70 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69          int bExi
31a80 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
31a90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
31aa0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
31ab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
31ac0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
31ad0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
31ae0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
31af0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
31b00 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78  ESS_EXISTS, &bEx
31b10 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69  ists);.        i
31b20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31b30 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
31b40 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
31b50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31b60 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
31b70 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
31b80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31b90 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
31ba0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
31bb0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
31bc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31bd0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
31be0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
31bf0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
31c00 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
31c10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
31c20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
31c30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
31c40 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
31c50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31c60 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
31c70 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
31c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
31c90 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
31ca0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
31cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
31cc0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
31cd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
31ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31cf0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
31d00 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
31d10 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
31d20 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
31d30 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
31d40 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
31d50 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
31d60 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
31d70 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
31d80 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
31d90 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
31da0 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
31db0 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
31dc0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
31dd0 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
31de0 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
31df0 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
31e00 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
31e10 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
31e20 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
31e30 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
31e40 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
31e50 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
31e60 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
31e70 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
31e80 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
31e90 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
31ea0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
31eb0 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
31ec0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
31ed0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31ee0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
31ef0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
31f00 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
31f10 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
31f20 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
31f30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31f40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31f50 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
31f60 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
31f70 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
31f80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
31f90 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
31fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
31fb0 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
31fc0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
31fd0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
31fe0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
31ff0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
32000 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
32010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32020 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
32030 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
32040 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
32050 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
32060 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
32070 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
32080 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
32090 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
320a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
320b0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
320c0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
320d0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
320e0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
320f0 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
32100 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
32110 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
32120 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
32130 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
32140 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
32150 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
32160 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
32170 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
32180 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
32190 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
321a0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
321b0 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
321c0 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
321d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
321e0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
321f0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
32200 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
32210 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
32220 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
32230 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
32240 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
32250 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
32260 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
32270 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
32280 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
32290 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
322a0 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
322b0 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
322c0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
322d0 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
322e0 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
322f0 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
32300 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
32310 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
32320 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
32330 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
32340 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
32350 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
32360 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
32370 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
32380 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
32390 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
323a0 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
323b0 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
323c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
323d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
323e0 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
323f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
32400 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
32410 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
32420 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
32430 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
32440 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32450 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
32460 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
32470 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
32480 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
32490 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
324a0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
324b0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
324c0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
324d0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
324e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
324f0 6d 70 46 69 6c 65 20 26 26 20 28 0a 20 20 20 20  mpFile && (.    
32500 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 61 63      pPager->pBac
32510 6b 75 70 20 0a 20 20 20 20 20 7c 7c 20 73 71 6c  kup .     || sql
32520 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
32530 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
32540 63 68 65 29 3e 30 20 0a 20 20 20 20 20 7c 7c 20  che)>0 .     || 
32550 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
32560 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f  .    )){.      /
32570 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
32580 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
32590 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
325a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
325b0 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
325c0 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
325d0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
325e0 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
325f0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
32600 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
32610 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
32620 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
32630 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
32640 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
32650 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32660 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
32670 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
32680 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
32690 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
326a0 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
326b0 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
326c0 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
326d0 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
326e0 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
326f0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
32700 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
32710 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
32720 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
32730 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
32740 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
32750 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
32760 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
32770 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
32780 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
32790 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
327a0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
327b0 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
327c0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
327d0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
327e0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
327f0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
32800 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
32810 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
32820 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
32830 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
32840 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
32850 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
32860 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
32870 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
32880 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  /.      Pgno nPa
32890 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  ge = 0;.      ch
328a0 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
328b0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
328c0 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20  ileVers)];..    
328d0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
328e0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
328f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
32900 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65   rc ) goto faile
32910 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50  d;..      if( nP
32920 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  age>0 ){.       
32930 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
32940 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
32950 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
32960 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
32970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
32980 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
32990 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
329a0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
329b0 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
329c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
329d0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
329e0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
329f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
32a00 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
32a10 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
32a20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
32a30 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
32a40 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32a50 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
32a60 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
32a70 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
32a80 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
32a90 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
32aa0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
32ab0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
32ac0 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  er);..        /*
32ad0 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62   Unmap the datab
32ae0 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20  ase file. It is 
32af0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65 78  possible that ex
32b00 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73  ternal processes
32b10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
32b20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20 74  have truncated t
32b30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32b40 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64   and then extend
32b50 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20  ed it back.     
32b60 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69     ** to its ori
32b70 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65  ginal size while
32b80 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77 61   this process wa
32b90 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20  s not holding a 
32ba0 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  lock..        **
32bb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32bc0 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61 20  ere may exist a 
32bd0 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69  Pager.pMap mappi
32be0 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73 0a  ng that appears.
32bf0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
32c00 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 20   the right size 
32c10 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61  but is not actua
32c20 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64  lly valid. Avoid
32c30 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
32c40 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20   possibility by 
32c50 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62  unmapping the db
32c60 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20   here. */.      
32c70 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
32c80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
32c90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
32ca0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
32cb0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
32cc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
32cd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
32ce0 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
32cf0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
32d00 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
32d10 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
32d20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
32d30 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
32d40 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
32d50 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
32d60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
32d70 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
32d80 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
32d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32da0 4b 20 26 26 20 50 61 67 65 72 4f 74 61 4d 6f 64  K && PagerOtaMod
32db0 65 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  e(pPager) ){.   
32dc0 20 20 20 69 6e 74 20 6e 57 61 6c 20 3d 20 73 71     int nWal = sq
32dd0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 50  lite3Strlen30(pP
32de0 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 20 20 20  ager->zWal);.   
32df0 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b     pPager->zWal[
32e00 6e 57 61 6c 2d 33 5d 20 3d 20 27 6f 27 3b 0a 20  nWal-3] = 'o';. 
32e10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f       rc = pagerO
32e20 70 65 6e 57 61 6c 49 6e 74 65 72 6e 61 6c 28 70  penWalInternal(p
32e30 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
32e40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
32e50 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73  _OMIT_WAL.    as
32e60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
32e70 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  al==0 || rc==SQL
32e80 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66  ITE_OK );.#endif
32e90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
32ea0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32eb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
32ec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32ed0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65      rc = pagerBe
32ee0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
32ef0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
32f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32f10 4b 20 26 26 20 50 61 67 65 72 4f 74 61 4d 6f 64  K && PagerOtaMod
32f20 65 28 70 50 61 67 65 72 29 3d 3d 31 20 29 7b 0a  e(pPager)==1 ){.
32f30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32f40 65 33 57 61 6c 43 68 65 63 6b 53 61 6c 74 28 70  e3WalCheckSalt(p
32f50 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
32f60 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
32f70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32f80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
32f90 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
32fa0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 2c 20 30 2c  ger->pWal, 0, 0,
32fb0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
32fc0 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20  ger->pWal = 0;. 
32fd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
32fe0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
32ff0 5f 4f 54 41 0a 20 20 20 20 20 20 20 20 70 50 61  _OTA.        pPa
33000 67 65 72 2d 3e 6f 74 61 4d 6f 64 65 20 3d 20 32  ger->otaMode = 2
33010 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
33020 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
33030 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33040 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
33050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33060 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50  .    rc = pagerP
33070 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
33080 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   &pPager->dbSize
33090 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
330a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
330b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
330c0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
330d0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
330e0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
330f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
33100 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
33110 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
33120 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
33130 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
33140 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
33150 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
33160 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
33170 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
33180 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
33190 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
331a0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
331b0 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
331c0 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
331d0 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
331e0 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
331f0 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
33200 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
33210 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
33220 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
33230 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
33240 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
33250 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
33260 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
33270 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
33280 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
33290 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
332a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
332b0 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d  ager->nMmapOut==
332c0 30 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61  0 && (sqlite3Pca
332d0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
332e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
332f0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
33300 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
33310 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
33320 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
33330 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
33340 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
33350 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
33360 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
33370 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
33380 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
33390 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
333a0 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
333b0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
333c0 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
333d0 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
333e0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
333f0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
33400 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
33410 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
33420 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
33430 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
33440 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
33450 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
33460 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
33470 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
33480 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33490 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
334a0 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
334b0 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
334c0 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
334d0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
334e0 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
334f0 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
33500 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
33510 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
33520 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
33530 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
33540 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
33550 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
33560 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
33570 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
33580 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
33590 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
335a0 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
335b0 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
335c0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
335d0 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
335e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
335f0 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
33600 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
33610 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
33620 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
33630 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
33640 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
33650 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
33660 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
33670 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
33680 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
33690 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
336a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
336b0 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
336c0 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
336d0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
336e0 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
336f0 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
33700 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
33710 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
33720 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
33730 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
33740 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
33750 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
33760 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
33770 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
33780 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
33790 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
337a0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
337b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
337c0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
337d0 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
337e0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
337f0 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
33800 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
33810 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
33820 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
33830 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
33840 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
33850 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
33860 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
33870 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
33880 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
33890 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
338a0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
338b0 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
338c0 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
338d0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
338e0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
338f0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
33900 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
33910 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
33920 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
33930 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
33940 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
33950 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
33960 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
33970 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
33980 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
33990 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
339a0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
339b0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
339c0 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
339d0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
339e0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
339f0 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
33a00 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
33a10 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
33a20 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
33a30 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
33a40 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
33a50 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
33a60 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
33a70 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
33a80 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
33a90 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
33aa0 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
33ab0 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
33ac0 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
33ad0 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
33ae0 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
33af0 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
33b00 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
33b10 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
33b20 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
33b30 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
33b40 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
33b50 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
33b60 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
33b70 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
33b80 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
33b90 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
33ba0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
33bb0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
33bc0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
33bd0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
33be0 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
33bf0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
33c00 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
33c10 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
33c20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
33c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
33c40 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
33c50 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
33c60 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
33c70 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
33c80 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
33c90 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
33ca0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
33cb0 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
33cc0 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
33cd0 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
33ce0 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
33cf0 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
33d00 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
33d10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
33d20 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
33d30 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
33d40 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
33d50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
33d60 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
33d70 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
33d80 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
33d90 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
33da0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
33db0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
33dc0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
33dd0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
33de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
33df0 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
33e00 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
33e10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33e20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
33e30 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
33e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33e50 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65    /* Frame to re
33e60 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  ad from WAL file
33e70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
33e80 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61  noContent = (fla
33e90 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e  gs & PAGER_GET_N
33ea0 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a  OCONTENT);..  /*
33eb0 20 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c   It is acceptabl
33ec0 65 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d  e to use a read-
33ed0 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65  only (mmap) page
33ee0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78   for any page ex
33ef0 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31  cept.  ** page 1
33f00 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
33f10 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33f20 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43  n open or the AC
33f30 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20  QUIRE_READONLY. 
33f40 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65   ** flag was spe
33f50 63 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61  cified by the ca
33f60 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e  ller. And so lon
33f70 67 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e  g as the db is n
33f80 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  ot a .  ** tempo
33f90 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72  rary or in-memor
33fa0 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  y database.  */.
33fb0 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61    const int bMma
33fc0 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26  pOk = (pgno!=1 &
33fd0 26 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  & USEFETCH(pPage
33fe0 72 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  r).   && (pPager
33ff0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
34000 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73  READER || (flags
34010 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   & PAGER_GET_REA
34020 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66 20 53  DONLY)).#ifdef S
34030 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
34040 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43     && pPager->xC
34050 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20  odec==0.#endif. 
34060 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
34070 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
34080 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
34090 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
340a0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
340b0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
340c0 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c   noContent==0 ||
340d0 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a   bMmapOk==0 );..
340e0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
340f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34100 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
34120 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
34130 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
34140 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
34150 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
34160 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
34170 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
34180 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
34190 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
341a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
341b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
341c0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
341d0 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
341e0 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
341f0 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
34200 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
34210 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
34220 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
34230 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
34240 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
34250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
34260 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34270 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
34280 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
34290 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  & iFrame==0 ){. 
342a0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
342b0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20   = 0;..      rc 
342c0 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68  = sqlite3OsFetch
342d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20  (pPager->fd, .  
342e0 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67          (i64)(pg
342f0 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
34300 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72  pageSize, pPager
34310 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61  ->pageSize, &pDa
34320 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  ta.      );..   
34330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34340 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
34350 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
34360 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
34370 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20  R_READER ){.    
34380 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
34390 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
343a0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
343b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
343c0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
343d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
343e0 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
343f0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70  (pPager, pgno, p
34400 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20  Data, &pPg);.   
34410 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34420 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
34430 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
34440 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
34450 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
34460 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
34470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
34480 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20   pPg ){.        
34490 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
344a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
344b0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
344c0 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  Pg;.          re
344d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
344e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
344f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
34500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34510 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34520 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34530 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
34540 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
34550 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61  pcache_page *pBa
34560 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20  se;.      pBase 
34570 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
34580 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
34590 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a  ache, pgno, 3);.
345a0 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d        if( pBase=
345b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
345c0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
345d0 46 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67  FetchStress(pPag
345e0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
345f0 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20  o, &pBase);.    
34600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34610 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34620 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
34640 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
34650 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34660 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
34670 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
34680 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
34690 70 50 67 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  pPg==0 ) rc = SQ
346a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
346b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
346c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
346d0 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
346e0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
346f0 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
34700 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
34710 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
34720 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
34730 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
34740 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
34750 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
34760 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
34770 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
34780 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
34790 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
347a0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
347b0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
347c0 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
347d0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
347e0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
347f0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
34800 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
34810 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
34820 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
34830 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
34840 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
34850 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
34860 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
34870 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
34880 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
34890 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
348a0 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
348b0 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
348c0 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
348d0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
348e0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
348f0 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
34900 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
34910 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
34920 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  t[PAGER_STAT_HIT
34930 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]++;.    return 
34940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
34950 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
34960 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
34970 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
34980 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
34990 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
349a0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
349b0 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20    */..    pPg = 
349c0 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67  *ppPage;.    pPg
349d0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
349e0 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
349f0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
34a00 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
34a10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34a20 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
34a30 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
34a40 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
34a50 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
34a60 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
34a70 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
34a80 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
34a90 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
34aa0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34ab0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
34ac0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34ad0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
34ae0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34af0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
34b00 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50   if( MEMDB || pP
34b10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e  ager->dbSize<pgn
34b20 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c  o || noContent |
34b30 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
34b40 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
34b50 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
34b60 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
34b70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
34b80 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  LL;.        goto
34b90 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34ba0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34bb0 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
34bc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
34bd0 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
34be0 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
34bf0 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
34c00 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
34c10 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
34c20 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
34c30 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
34c40 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
34c50 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
34c60 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
34c70 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
34c80 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
34c90 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
34ca0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
34cb0 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
34cc0 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
34cd0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
34ce0 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
34cf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
34d00 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
34d10 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
34d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
34d30 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
34d40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
34d50 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
34d60 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
34d70 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
34d80 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76   = ) sqlite3Bitv
34d90 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
34da0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
34db0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
34dc0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
34dd0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
34de0 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f   }.        TESTO
34df0 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
34e00 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
34e10 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  s(pPager, pgno);
34e20 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
34e30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
34e40 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  MEM );.        s
34e50 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
34e60 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d  alloc();.      }
34e70 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
34e80 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
34e90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
34ea0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
34eb0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
34ec0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
34ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34ee0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
34ef0 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70  pPager) && bMmap
34f00 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Ok==0 ){.       
34f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
34f20 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
34f30 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
34f40 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  Frame);.        
34f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34f60 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
34f70 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34f80 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
34f90 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
34fa0 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70  Pager );.      p
34fb0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
34fc0 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b  ER_STAT_MISS]++;
34fd0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
34fe0 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
34ff0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
35000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35010 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
35020 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35040 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
35050 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  hash(pPg);.  }..
35060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35070 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
35080 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
35090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
350a0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
350b0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
350c0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
350d0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
350e0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a  nused(pPager);..
350f0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
35100 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35110 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
35120 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
35130 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
35140 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
35150 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
35160 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
35170 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
35180 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
35190 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
351a0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
351b0 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20  che. .**.** See 
351c0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
351d0 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
351e0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
351f0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
35200 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
35210 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
35220 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
35230 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
35240 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
35250 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
35260 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
35270 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
35280 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
35290 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
352a0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
352b0 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
352c0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
352d0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
352e0 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
352f0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
35300 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
35310 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33  pgno){.  sqlite3
35320 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50  _pcache_page *pP
35330 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
35340 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
35350 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
35360 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35370 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
35380 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74  .  pPage = sqlit
35390 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
353a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
353b0 67 6e 6f 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  gno, 0);.  retur
353c0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  n sqlite3PcacheF
353d0 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65  etchFinish(pPage
353e0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
353f0 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pPage);.}../*.
35400 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
35410 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
35420 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
35430 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
35440 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
35450 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
35460 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
35470 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
35480 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
35490 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
354a0 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
354b0 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
354c0 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
354d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
354e0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
354f0 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
35500 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
35510 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50  tNull(DbPage *pP
35520 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
35530 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
35540 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  Pg!=0 );.  pPage
35550 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
35560 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
35570 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29  s & PGHDR_MMAP )
35580 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61  {.    pagerRelea
35590 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a  seMapPage(pPg);.
355a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
355b0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
355c0 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  e(pPg);.  }.  pa
355d0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
355e0 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69  d(pPager);.}.voi
355f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
35600 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
35610 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71  {.  if( pPg ) sq
35620 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
35630 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a  otNull(pPg);.}..
35640 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
35650 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
35660 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
35670 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
35680 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
35690 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
356a0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
356b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
356c0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
356d0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
356e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
356f0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
35700 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
35710 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
35720 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
35730 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
35740 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
35750 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
35760 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
35770 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
35780 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
35790 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
357a0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
357b0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
357c0 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
357d0 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
357e0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
357f0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
35800 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
35810 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
35820 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
35830 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
35840 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
35850 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35860 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
35870 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
35880 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
35890 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
358a0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
358b0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
358c0 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
358d0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
358e0 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
358f0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
35900 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
35910 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
35920 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
35930 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
35940 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
35950 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
35960 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
35970 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
35980 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
35990 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
359a0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
359b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
359c0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
359d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
359e0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
359f0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
35a00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
35a10 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
35a20 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
35a30 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
35a40 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
35a50 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
35a60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
35a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
35aa0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
35ab0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
35ac0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
35ad0 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
35ae0 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
35af0 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
35b00 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35b10 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
35b20 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
35b30 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
35b40 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
35b50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35b60 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
35b70 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
35b80 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
35b90 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
35ba0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
35bb0 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
35bc0 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
35bd0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
35be0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
35bf0 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
35c00 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
35c10 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
35c20 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
35c30 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
35c40 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
35c50 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65  de;..  if( !page
35c60 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
35c70 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
35c80 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
35c90 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
35ca0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
35cb0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
35cc0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
35cd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
35ce0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
35cf0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
35d00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
35d10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
35d20 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .  .    /* Open 
35d30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35d40 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
35d50 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
35d60 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
35d70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
35d80 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
35d90 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
35da0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
35db0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
35dc0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
35dd0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
35de0 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  jfd);.      }els
35df0 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  e{.        const
35e00 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35e20 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
35e30 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
35e40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51   */.          SQ
35e50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
35e60 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
35e70 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
35e80 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46    (pPager->tempF
35e90 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ile ? .         
35ea0 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
35eb0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
35ec0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
35ed0 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20  OURNAL):.       
35ee0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
35ef0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
35f00 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20            );..  
35f10 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
35f20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
35f30 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20  e still has the 
35f40 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20  same name as it 
35f50 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20  did when.       
35f60 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69   ** it was origi
35f70 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  nally opened. */
35f80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61  .        rc = da
35f90 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
35fa0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
35fb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35fc0 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  OK ){.#ifdef SQL
35fd0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
35fe0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
35ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
36000 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
36010 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
36020 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
36030 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
36040 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
36050 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
36060 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20        );.#else. 
36070 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
36080 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
36090 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
360a0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
360b0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64   flags, 0);.#end
360c0 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
360d0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
360e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
360f0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
36100 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d  r->jfd) );.    }
36110 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72  .  .  .    /* Wr
36120 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
36130 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
36140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36150 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a   and open .    *
36160 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
36170 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
36180 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
36190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
361a0 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43        /* TODO: C
361b0 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
361c0 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
361d0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
361e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
361f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
36200 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
36210 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
36220 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
36230 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
36240 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
36250 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
36260 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
36270 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
36280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36290 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
362a0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
362b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
362c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
362d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
362e0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
362f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36300 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36310 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50  LOCKED );.    pP
36320 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
36330 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
36340 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  EMOD;.  }..  ret
36350 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36360 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
36370 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
36380 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
36390 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
363a0 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
363b0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
363c0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
363d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
363e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
363f0 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
36400 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
36410 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
36420 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
36430 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
36440 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
36450 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
36460 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
36470 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
36480 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
36490 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
364a0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
364b0 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
364c0 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
364d0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
364e0 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
364f0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
36500 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
36510 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
36520 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
36530 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
36540 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
36550 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
36560 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
36570 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
36580 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
36590 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
365a0 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
365b0 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
365c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
365d0 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
365e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
365f0 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
36600 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
36610 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
36620 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
36630 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
36640 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
36650 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
36660 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
36670 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
36680 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
36690 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
366a0 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
366b0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
366c0 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
366d0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
366e0 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
366f0 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
36700 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36710 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
36720 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
36730 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36750 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
36760 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
36770 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
36780 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67  _ERROR );.  pPag
36790 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
367a0 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
367b0 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  ory;..  if( ALWA
367c0 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  YS(pPager->eStat
367d0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29  e==PAGER_READER)
367e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
367f0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36800 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66  al==0 );..    if
36810 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
36820 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  ager) ){.      /
36830 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
36840 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
36850 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  use locking_mode
36860 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20  =exclusive, and 
36870 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  an.      ** excl
36880 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
36890 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
368a0 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  t already held, 
368b0 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20  obtain it now.. 
368c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
368d0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
368e0 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74  iveMode && sqlit
368f0 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
36900 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
36910 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
36920 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
36930 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
36940 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
36950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
36970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
36990 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
369a0 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
369b0 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 1);.      }.
369c0 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74  .      /* Grab t
369d0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
369e0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
369f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70  f successful, up
36a00 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a  grade to.      *
36a10 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
36a20 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
36a30 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
36a40 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
36a50 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  aller..      ** 
36a60 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  The busy-handler
36a70 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20   is not invoked 
36a80 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  if another conne
36a90 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20  ction already.  
36aa0 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65      ** holds the
36ab0 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20   write-lock. If 
36ac0 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70  possible, the up
36ad0 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63  per layer will c
36ae0 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  all it..      */
36af0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36b00 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
36b10 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
36b20 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d  er->pWal);.    }
36b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  else{.      /* O
36b40 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
36b50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36b60 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
36b70 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
36b80 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ter.      ** is 
36b90 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
36ba0 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
36bb0 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
36bc0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
36bd0 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
36be0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
36bf0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
36c00 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
36c10 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a  XCLUSIVE.      *
36c20 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20  * lock, but not 
36c30 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74  when obtaining t
36c40 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
36c50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36c60 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
36c70 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
36c80 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
36c90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36ca0 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20  K && exFlag ){. 
36cb0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
36cc0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
36cd0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
36ce0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
36cf0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
36d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36d10 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
36d20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  to WRITER_LOCKED
36d30 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
36d40 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
36d50 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53  de sets Pager.eS
36d60 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52  tate to PAGER_WR
36d70 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43  ITER_LOCKED or C
36d80 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a  ACHEMOD.      **
36d90 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20   when it has an 
36da0 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
36db0 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44  , but never to D
36dc0 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44  BMOD or FINISHED
36dd0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
36de0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
36df0 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63  ose states the c
36e00 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ode to roll back
36e10 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
36e20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36e30 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20  s may copy data 
36e40 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
36e50 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61  rnal into the da
36e60 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a  tabase .      **
36e70 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73   file as well as
36e80 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63   into the page c
36e90 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c  ache. Which woul
36ea0 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69  d be incorrect i
36eb0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  n .      ** WAL 
36ec0 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
36ed0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
36ee0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
36ef0 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  ER_LOCKED;.     
36f00 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
36f10 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
36f20 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
36f30 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
36f40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
36f50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
36f60 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
36f70 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
36f80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
36f90 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lOff = 0;.    }.
36fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
36fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
36fc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36fd0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
36fe0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
36ff0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
37000 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37010 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
37020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
37030 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37040 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a  (pPager) );.  }.
37050 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
37060 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
37070 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
37080 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r)));.  return r
37090 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
370a0 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
370b0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
370c0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
370d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
370e0 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
370f0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
37100 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
37110 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
37120 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
37130 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
37140 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37150 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
37160 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
37170 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
37180 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
37190 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
371a0 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
371b0 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
371c0 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
371d0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
371e0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
371f0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
37200 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
37210 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
37220 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37230 3b 0a 20 20 69 6e 74 20 69 6e 4a 6f 75 72 6e 61  ;.  int inJourna
37240 6c 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  l;..  /* This ro
37250 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
37260 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69  led unless a wri
37270 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
37280 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a  as already .  **
37290 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54   been started. T
372a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
372b0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
372c0 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  e open at this p
372d0 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73  oint..  ** It is
372e0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
372f0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
37300 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
37310 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37320 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37330 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
37340 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37350 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
37360 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
37370 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37380 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
37390 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
373a0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
373b0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
373c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
373d0 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20  >errCode==0 );. 
373e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
373f0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
37400 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
37410 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f  g);..  /* The jo
37420 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
37430 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48   to be opened. H
37440 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
37450 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ines have alread
37460 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20  y.  ** obtained 
37470 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
37480 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65  cks to begin the
37490 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
374a0 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a  on, but the.  **
374b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
374c0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20  l might not yet 
374d0 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74  be open. Open it
374e0 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20   now if this is 
374f0 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  the case..  **. 
37500 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65   ** This is done
37510 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
37520 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
37530 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20  eDirty() on the 
37540 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  page. .  ** Othe
37550 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72  rwise, if it wer
37560 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c  e done after cal
37570 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
37580 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74  heMakeDirty(), t
37590 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f  hen.  ** an erro
375a0 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e  r might occur an
375b0 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c  d the pager woul
375c0 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54  d end up in WRIT
375d0 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a  ER_LOCKED state.
375e0 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20    ** with pages 
375f0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
37600 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  in the cache..  
37610 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
37620 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37630 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
37640 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
37650 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
37660 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
37670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37680 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
37690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
376a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
376b0 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
376c0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
376d0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
376e0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  er) );..  /* Mar
376f0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
37700 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
37710 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
37720 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
37730 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
37740 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
37750 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
37760 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
37770 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
37780 3b 0a 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  ;.  inJournal = 
37790 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
377a0 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 69 66  ager, pPg);.  if
377b0 28 20 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ( inJournal && (
377c0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
377d0 6e 74 3d 3d 30 20 7c 7c 20 21 73 75 62 6a 52 65  nt==0 || !subjRe
377e0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 29  quiresPage(pPg))
377f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37800 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
37810 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  ger) );.  }else{
37820 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
37830 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
37840 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
37850 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
37860 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
37870 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
37880 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
37890 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
378a0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
378b0 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
378c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
378d0 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
378e0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
378f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37900 20 21 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 21   !inJournal && !
37910 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37920 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
37930 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
37940 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
37950 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
37960 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
37970 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e  igSize && isOpen
37980 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
37990 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
379a0 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  um;.        char
379b0 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20   *pData2;.      
379c0 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61    i64 iOff = pPa
379d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
379e0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  ..        /* We 
379f0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
37a00 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
37a10 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
37a20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
37a30 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
37a40 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
37a50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
37a60 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
37a70 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
37a80 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
37a90 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
37aa0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
37ab0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  NO(pPager) );.. 
37ac0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
37ae0 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r<=pPager->journ
37af0 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20  alOff );.       
37b00 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
37b10 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d  pPg->pData, pPg-
37b20 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
37b30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
37b40 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
37b50 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
37b60 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
37b70 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20  )pData2);..     
37b80 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
37b90 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
37ba0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
37bb0 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalling t
37bc0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
37bd0 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  ge in the block 
37be0 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e  above, set the n
37bf0 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f  eed-sync flag fo
37c00 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  r the page..    
37c10 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
37c20 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
37c30 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
37c40 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
37c50 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
37c60 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
37c70 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
37c80 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
37c90 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
37ca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
37cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37cc0 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
37cd0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
37ce0 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20  e doing so,.    
37cf0 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72      ** then corr
37d00 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
37d10 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
37d20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
37d30 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
37d40 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63  YNC;..        rc
37d50 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
37d60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
37d70 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37d80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37d90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37da0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
37db0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
37dc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
37dd0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
37de0 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b  geSize, iOff+4);
37df0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
37e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37e10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
37e20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
37e30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
37e40 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ff+pPager->pageS
37e50 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20  ize+4, cksum);. 
37e60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37e70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37e80 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49  n rc;..        I
37e90 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
37ea0 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
37eb0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
37ec0 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
37ed0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37ee0 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
37ef0 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
37f00 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
37f10 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
37f20 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
37f30 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
37f40 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
37f50 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
37f60 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
37f80 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
37f90 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
37fa0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
37fb0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
37fc0 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
37fd0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
37fe0 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ;..        pPage
37ff0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
38000 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67   8 + pPager->pag
38010 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70  eSize;.        p
38020 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
38030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
38040 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
38050 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
38060 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
38070 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
38080 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
38090 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
380a0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
380b0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
380c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
380d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
380e0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
380f0 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61  .        rc |= a
38100 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
38110 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
38120 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
38130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38140 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
38150 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
38160 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
38170 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
38180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
381a0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
381b0 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
381c0 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20  _DBMOD ){.      
381d0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
381e0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
381f0 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
38200 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
38210 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
38220 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
38230 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
38240 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
38250 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
38260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
38270 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
38280 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
38290 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
382a0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
382b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
382c0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
382d0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
382e0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
382f0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
38300 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
38310 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
38320 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
38330 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
38340 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
38350 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
38360 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
38370 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
38380 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
38390 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
383a0 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
383b0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
383c0 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  f( pPager->nSave
383d0 70 6f 69 6e 74 3e 30 20 26 26 20 73 75 62 6a 52  point>0 && subjR
383e0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
383f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
38400 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
38410 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
38420 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
38430 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
38440 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
38450 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
38460 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
38470 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
38480 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
38490 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
384a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
384b0 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66 20 73  s a variant of s
384c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
384d0 28 29 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  () that runs whe
384e0 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
384f0 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74  e.** is larger t
38500 68 61 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  han the page siz
38510 65 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  e.  SQLite makes
38520 20 74 68 65 20 28 72 65 61 73 6f 6e 61 62 6c 65   the (reasonable
38530 29 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61  ) assumption tha
38540 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20 6f  t.** all bytes o
38550 66 20 61 20 73 65 63 74 6f 72 20 61 72 65 20 77  f a sector are w
38560 72 69 74 74 65 6e 20 74 6f 67 65 74 68 65 72 20  ritten together 
38570 62 79 20 68 61 72 64 77 61 72 65 2e 20 20 48 65  by hardware.  He
38580 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65 73 20 6f  nce, all bytes o
38590 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e 65  f.** a sector ne
385a0 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
385b0 6c 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20 61  led in case of a
385c0 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20 74   power loss in t
385d0 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
385e0 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 55  a write..**.** U
385f0 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 65 63 74  sually, the sect
38600 6f 72 20 73 69 7a 65 20 69 73 20 6c 65 73 73 20  or size is less 
38610 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
38620 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2c 20   the page size, 
38630 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61 73 65  in which.** case
38640 20 70 61 67 65 73 20 63 61 6e 20 62 65 20 69 6e   pages can be in
38650 64 69 76 69 64 75 61 6c 6c 79 20 77 72 69 74 74  dividually writt
38660 65 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  en.  This routin
38670 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e 20 74  e only runs in t
38680 68 65 20 65 78 63 65 70 74 69 6f 6e 61 6c 0a 2a  he exceptional.*
38690 2a 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  * case where the
386a0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 6d   page size is sm
386b0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 73  aller than the s
386c0 65 63 74 6f 72 20 73 69 7a 65 2e