/ Hex Artifact Content
Login

Artifact a98e9760c8750e25d2ae6f6dc78b20f192408b85047e8811fcc5918af464b887:


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 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
7ed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
7ee0: 55 52 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20  URRENT.  Bitvec 
7ef0: 2a 70 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20  *pAllRead;      
7f00: 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65       /* Pages re
7f10: 61 64 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e  ad within curren
7f20: 74 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  t CONCURRENT tra
7f30: 6e 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ns. */.#endif.  
7f40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7f50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7f60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f70: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7f80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7f90: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7fa0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7fb0: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7fd0: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7fe0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7ff0: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
8000: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
8010: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
8020: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
8030: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
8040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8050: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
8060: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
8070: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
8080: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
8090: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
80a0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
80b0: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
80c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
80d0: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
80e0: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
80f0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
8100: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
8110: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
8120: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
8130: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8150: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
8160: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
8170: 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74  [] */.  u32 iDat
8180: 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20  aVersion;       
8190: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
81a0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
81b0: 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73   content changes
81c0: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
81d0: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
81e0: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
81f0: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
8200: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a  ile changes */..
8210: 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20    int nMmapOut; 
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8230: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20   Number of mmap 
8240: 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
8250: 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20  outstanding */. 
8260: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
8270: 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  zMmap;       /* 
8280: 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20  Desired maximum 
8290: 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50  mmap size */.  P
82a0: 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c  gHdr *pMmapFreel
82b0: 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist;       /* Li
82c0: 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20  st of free mmap 
82d0: 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44  page headers (pD
82e0: 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20  irty) */.  /*.  
82f0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f  ** End of the ro
8300: 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67  utinely-changing
8310: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20   class members. 
8320: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
8330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20  ************/.. 
8370: 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20   u16 nExtra;    
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8390: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
83a0: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
83b0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
83c0: 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20  i16 nReserve;   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
83e0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
83f0: 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20  bytes at end of 
8400: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
8410: 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20  32 vfsFlags;    
8420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
8430: 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
8440: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
8450: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8470: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
8480: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
8490: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  ack */.  int pag
84a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
84b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
84c0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
84d0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
84e0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
84f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
8500: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
8510: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
8520: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
8530: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
8540: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
8550: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
8560: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72   files */.  char
8570: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
8580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
85a0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
85b0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
85c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
85d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
85e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  e */.  int (*xBu
85f0: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
8600: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
8610: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
8620: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
8630: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
8640: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
8650: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
8660: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20  andler */.  int 
8670: 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20  aStat[3];       
8680: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8690: 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   cache hits, mis
86a0: 73 65 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a  ses and writes *
86b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
86c0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64  TEST.  int nRead
86d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
86e0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
86f0: 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e  ages read */.#en
8700: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
8710: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
8720: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
8730: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
8740: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  ading pages */. 
8750: 20 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67   int (*xGet)(Pag
8760: 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a  er*,Pgno,DbPage*
8770: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  *,int); /* Routi
8780: 6e 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61  ne to fetch a pa
8790: 74 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  tch */.#ifdef SQ
87a0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
87b0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
87c0: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
87d0: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
87e0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
87f0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8800: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8810: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
8820: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
8830: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8840: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8850: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8860: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8870: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8880: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8890: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
88b0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
88c0: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
88d0: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
88e0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
88f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8900: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8910: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
8920: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
8930: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8940: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8950: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8960: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8970: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8980: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
89b0: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
89c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
89d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89f0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8a00: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8a10: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
8a20: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
8a30: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8a40: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8a50: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8a60: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8a70: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8a80: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8a90: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8aa0: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8ab0: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8ac0: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8ad0: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
8ae0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8af0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
8b00: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
8b10: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
8b20: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
8b30: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8b40: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8b50: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8b60: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8b70: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8b80: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8b90: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8ba0: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8bb0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8bc0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8bd0: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
8be0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
8bf0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
8c00: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8c10: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
8c20: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8c30: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8c40: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8c50: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8c60: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8c70: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8c80: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8c90: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8ca0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8cb0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8cc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8cd0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8ce0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
8cf0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8d00: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
8d10: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8d20: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
8d30: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8d40: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8d50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8d60: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8d70: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8d80: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8d90: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8da0: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8db0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8dc0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8dd0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8de0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8df0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8e00: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8e10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8e20: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8e30: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8e40: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8e50: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8e60: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8e70: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8e80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8e90: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8ea0: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8eb0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8ec0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8ed0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ee0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8ef0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8f00: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8f10: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8f20: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8f30: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8f40: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8f50: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8f60: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8f70: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8f80: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8f90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8fa0: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8fb0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8fc0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8fd0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8fe0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8ff0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
9000: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
9010: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
9020: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
9030: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
9040: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
9050: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
9060: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
9070: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
9080: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
9090: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
90a0: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
90b0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
90c0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
90d0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
90e0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
90f0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
9100: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
9110: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
9120: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
9130: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
9140: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
9150: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
9160: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
9170: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
9180: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
9190: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
91a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
91b0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
91c0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
91d0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
91e0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
91f0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
9200: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
9210: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
9220: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
9230: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
9240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9250: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9260: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
9270: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
9280: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
9290: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
92a0: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
92b0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
92c0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
92d0: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
92e0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
92f0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
9300: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
9310: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
9320: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
9330: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9340: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9350: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9360: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9370: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9380: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9390: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
93a0: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
93b0: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
93c0: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
93d0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
93e0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
93f0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
9400: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
9410: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
9420: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9430: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9440: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9450: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9460: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9470: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9480: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9490: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
94a0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
94b0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
94c0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
94d0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
94e0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
94f0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
9500: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
9510: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9520: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
9530: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9540: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9550: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9560: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9570: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9580: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9590: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
95a0: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
95b0: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
95c0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
95d0: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
95e0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
95f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9600: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
9610: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
9620: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
9630: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9640: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9650: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9660: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9670: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9680: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9690: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
96a0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
96b0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
96c0: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
96d0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
96e0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
96f0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
9700: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
9710: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
9720: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
9730: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9740: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9750: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9760: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9770: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9780: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9790: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
97a0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
97b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
97c0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
97d0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
97e0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
97f0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
9800: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
9810: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
9820: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
9830: 61 64 20 6c 6f 67 20 74 6f 20 72 65 61 64 20 70  ad log to read p
9840: 61 67 65 20 70 67 6e 6f 2e 0a 2a 2a 20 52 65 74  age pgno..** Ret
9850: 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
9860: 20 70 61 67 65 72 20 72 65 61 64 73 20 70 67 6e   pager reads pgn
9870: 6f 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  o directly from 
9880: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
9890: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
98a0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 26  LITE_OMIT_WAL) &
98b0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
98c0: 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
98d0: 5f 52 45 41 44 29 0a 69 6e 74 20 73 71 6c 69 74  _READ).int sqlit
98e0: 65 33 50 61 67 65 72 55 73 65 57 61 6c 28 50 61  e3PagerUseWal(Pa
98f0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
9900: 6f 20 70 67 6e 6f 29 7b 0a 20 20 75 33 32 20 69  o pgno){.  u32 i
9910: 52 65 61 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Read = 0;.  int 
9920: 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
9930: 2d 3e 70 57 61 6c 3d 3d 30 20 29 20 72 65 74 75  ->pWal==0 ) retu
9940: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c  rn 0;.  rc = sql
9950: 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
9960: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
9970: 67 6e 6f 2c 20 26 69 52 65 61 64 29 3b 0a 20 20  gno, &iRead);.  
9980: 72 65 74 75 72 6e 20 72 63 20 7c 7c 20 69 52 65  return rc || iRe
9990: 61 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ad;.}.#endif.#if
99a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
99b0: 5f 57 41 4c 0a 23 20 64 65 66 69 6e 65 20 70 61  _WAL.# define pa
99c0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 28 28 78  gerUseWal(x) ((x
99d0: 29 2d 3e 70 57 61 6c 21 3d 30 29 0a 23 65 6c 73  )->pWal!=0).#els
99e0: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
99f0: 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65  UseWal(x) 0.# de
9a00: 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61  fine pagerRollba
9a10: 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  ckWal(x) 0.# def
9a20: 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d  ine pagerWalFram
9a30: 65 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20  es(v,w,x,y) 0.# 
9a40: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
9a50: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
9a60: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
9a70: 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  ne pagerBeginRea
9a80: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20  dTransaction(z) 
9a90: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
9aa0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
9ab0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
9ac0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
9ad0: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
9ae0: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a  e(pPager) );.**.
9af0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9b00: 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72   runs many asser
9b10: 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e  ts to try to fin
9b20: 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65  d inconsistencie
9b30: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65  s in.** the inte
9b40: 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
9b50: 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a  e Pager object..
9b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73  */.static int as
9b70: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
9b80: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61  (Pager *p){.  Pa
9b90: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b  ger *pPager = p;
9ba0: 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73  ..  /* State mus
9bb0: 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  t be valid. */. 
9bc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9bd0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20  te==PAGER_OPEN. 
9be0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9bf0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
9c00: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9c10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9c20: 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
9c30: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9c40: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
9c50: 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
9c60: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9c70: 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20  WRITER_DBMOD.   
9c80: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9c90: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
9ca0: 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c  INISHED.       |
9cb0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9cc0: 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20  ER_ERROR.  );.. 
9cd0: 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f   /* Regardless o
9ce0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
9cf0: 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65  ate, a temp-file
9d00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61   connection alwa
9d10: 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20  ys behaves.  ** 
9d20: 61 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20  as if it has an 
9d30: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
9d40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
9d50: 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70  ile. It never up
9d60: 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63  dates.  ** the c
9d70: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
9d80: 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e  eld, so the chan
9d90: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
9da0: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a   is always set..
9db0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9dc0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9dd0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9de0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  SIVE_LOCK );.  a
9df0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9e00: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
9e10: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9e20: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9e30: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67   useJournal flag
9e40: 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a   is clear, the j
9e50: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74  ournal-mode must
9e60: 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a   be "OFF". .  **
9e70: 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72   And if the jour
9e80: 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46  nal-mode is "OFF
9e90: 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ", the journal f
9ea0: 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ile must not be 
9eb0: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  open..  */.  ass
9ec0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9ed0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9ee0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d  ALMODE_OFF || p-
9ef0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
9f00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9f10: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
9f20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9f30: 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  | !isOpen(p->jfd
9f40: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
9f50: 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c   that MEMDB impl
9f60: 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20  ies noSync. And 
9f70: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
9f80: 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a  rnal. Since .  *
9f90: 2a 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20  * this means an 
9fa0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
9fb0: 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61  performs no IO a
9fc0: 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74  t all, it cannot
9fd0: 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a   encounter .  **
9fe0: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
9ff0: 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46  OERR or SQLITE_F
a000: 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ULL during rollb
a010: 61 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e  ack or while fin
a020: 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20  alizing .  ** a 
a030: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61  journal file. (a
a040: 6c 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d  lthough the in-m
a050: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d  emory journal im
a060: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
a070: 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51   .  ** return SQ
a080: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
a090: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
a0a0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
a0b0: 20 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20   written). It . 
a0c0: 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65   ** is therefore
a0d0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
a0e0: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r an in-memory p
a0f0: 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
a100: 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74  e ERROR .  ** st
a110: 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ate..  */.  if( 
a120: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
a130: 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 2d 3e  ert( !isOpen(p->
a140: 66 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  fd) );.    asser
a150: 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a  t( p->noSync );.
a160: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a      assert( p->j
a170: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a180: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a190: 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  F .         || p
a1a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a1b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a1c0: 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a  _MEMORY .    );.
a1d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a1e0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
a1f0: 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21  OR && p->eState!
a200: 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
a210: 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
a220: 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a  UseWal(p)==0 );.
a230: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61    }..  /* If cha
a240: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20  ngeCountDone is 
a250: 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20  set, a RESERVED 
a260: 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
a270: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a  must be held.  *
a280: 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20  * on the file.. 
a290: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
a2a0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
a2b0: 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67  tDone==0 || pPag
a2c0: 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  er->eLock>=RESER
a2d0: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
a2e0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a2f0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
a300: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53  .  switch( p->eS
a310: 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tate ){.    case
a320: 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20   PAGER_OPEN:.   
a330: 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
a340: 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  B );.      asser
a350: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a360: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
a380: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
a390: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
a3a0: 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67  ache)==0 || pPag
a3b0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
a3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a3d0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41    case PAGER_REA
a3e0: 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72  DER:.      asser
a3f0: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a400: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a420: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a430: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a440: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a450: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
a460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a470: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a480: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20  TER_LOCKED:.    
a490: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a4a0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a4b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a4c0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4d0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4e0: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a4f0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a500: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a510: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
a520: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
a530: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
a540: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
a550: 45 4e 54 0a 20 20 20 20 20 20 61 73 73 65 72 74  ENT.      assert
a560: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
a570: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
a580: 53 69 7a 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Size || pPager->
a590: 70 41 6c 6c 52 65 61 64 20 29 3b 0a 23 65 6e 64  pAllRead );.#end
a5a0: 69 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  if.      assert(
a5b0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a5c0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a5d0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a5e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a5f0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a600: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a610: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a620: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a630: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a640: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a650: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a660: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a670: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a680: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a6a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a6b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a6c0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a6d0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a6e0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a6f0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a700: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a710: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a720: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a730: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a740: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a750: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a760: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a770: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a780: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a790: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a7a0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a7b0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a7c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a7d0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a7f0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a800: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a810: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a820: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a830: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a840: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a850: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a870: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a880: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a890: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a8b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a8c0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a8d0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a8e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a8f0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a900: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a910: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a920: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a930: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a940: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a950: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a960: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a970: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a980: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a990: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a9a0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a9b0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a9c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a9d0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a9e0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a9f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
aa00: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
aa10: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
aa20: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aa30: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
aa40: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
aa50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
aa60: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
aa70: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
aa80: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
aa90: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
aaa0: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aab0: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aac0: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aae0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aaf0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
ab00: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
ab10: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
ab20: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
ab30: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
ab40: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
ab50: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
ab60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ab70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
ab80: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ab90: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
aba0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
abb0: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
abc0: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
abd0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
abe0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
abf0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ac00: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ac10: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ac20: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac30: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
ac40: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
ac50: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
ac60: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
ac70: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
ac80: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
ac90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
aca0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
acb0: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
acc0: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
acd0: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ace0: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
acf0: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ad00: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ad10: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ad20: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
ad30: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
ad40: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
ad50: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
ad60: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ad70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ad80: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ad90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ada0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
adb0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
adc0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
add0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ade0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
adf0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ae00: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ae10: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ae20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ae30: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
ae40: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ae50: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
ae60: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
ae70: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
ae80: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ae90: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
aea0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
aeb0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
aec0: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
aed0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
aee0: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
aef0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
af00: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
af10: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
af20: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
af30: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
af40: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
af50: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
af60: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
af70: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
af80: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
af90: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
afa0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
afb0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
afc0: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
afd0: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
afe0: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
aff0: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
b000: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
b010: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
b020: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
b030: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
b040: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
b050: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
b060: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
b070: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
b080: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
b090: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
b0a0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b0b0: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b0c0: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b0d0: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b0e0: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b0f0: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b100: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b110: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b120: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b130: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b140: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b150: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b160: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b170: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b180: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b190: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b1a0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b1b0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b1c0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b1d0: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b1e0: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b1f0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b200: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b210: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b220: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b230: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b240: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b250: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b260: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b270: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b280: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b290: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b2a0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b2b0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b2c0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b2d0: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b2e0: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2f0: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b300: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b310: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b320: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b330: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b340: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b350: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b360: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b370: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b380: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b390: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b3a0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b3b0: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b3c0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b3d0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b3e0: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b3f0: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b400: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b410: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b420: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b430: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b440: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b450: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b460: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b470: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b480: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b490: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b4a0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b4b0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b4c0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b4d0: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b4e0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b4f0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b500: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b510: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b520: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b530: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b540: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b550: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b560: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b570: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b580: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b590: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b5a0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b5b0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b5c0: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b5d0: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b5e0: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b5f0: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b600: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b610: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b620: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b630: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b640: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b650: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b660: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b670: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b680: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b690: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b6a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b6b0: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b6c0: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6d0: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b6e0: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b6f0: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b700: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b710: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b720: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b730: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b740: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b750: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b760: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b770: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b780: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b790: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b7a0: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b7b0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b7c0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b7d0: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b7e0: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b7f0: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b800: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b810: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b820: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b830: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b840: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b850: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b860: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b870: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b880: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b890: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b8a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b8b0: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b8c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b8d0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b8e0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b8f0: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b900: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b910: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b920: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b930: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b940: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b950: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b960: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b970: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b980: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b990: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b9a0: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b9b0: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b9c0: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b9d0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b9e0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b9f0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ba00: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
ba10: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
ba20: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
ba30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
ba40: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
ba50: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
ba60: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
ba70: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
ba80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ba90: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
baa0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
bab0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
bac0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
bad0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
bae0: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
baf0: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
bb00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
bb10: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
bb20: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
bb30: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
bb40: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
bb50: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bb60: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bb70: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
bb80: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bb90: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
bba0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bbb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bbc0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bbd0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bbe0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bbf0: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bc00: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bc10: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bc20: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bc30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bc40: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bc50: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bc60: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bc70: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bc80: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bc90: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bca0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bcb0: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bcc0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bcd0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bce0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bcf0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bd00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bd10: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bd20: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bd30: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bd40: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bd50: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bd60: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bd70: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bd80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd90: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bda0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bdb0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bdc0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bdd0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bde0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bdf0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
be00: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
be10: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
be20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
be30: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
be40: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
be50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
be60: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
be70: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
be80: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
be90: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
bea0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
beb0: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
bec0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
bed0: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
bee0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
bef0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
bf00: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
bf10: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
bf20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
bf30: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
bf40: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bf50: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
bf60: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bf70: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bf80: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bf90: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bfa0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bfb0: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bfc0: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bfd0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bfe0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bff0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
c000: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
c010: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
c020: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
c030: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
c040: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
c050: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
c060: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
c070: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
c080: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
c090: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
c0a0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c0b0: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c0c0: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c0d0: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c0e0: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c0f0: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c100: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c110: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c120: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c130: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c140: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c150: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c160: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c170: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c180: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c190: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c1a0: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c1b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c1c0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c1d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c1e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c1f0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c200: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c210: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c220: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c230: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c240: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c250: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c260: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c270: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c280: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c290: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c2a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c2b0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c2c0: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c2d0: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c2e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c2f0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c300: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c310: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c320: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c330: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c340: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c350: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c360: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c370: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c380: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c390: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c3a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c3b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c3c0: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c3d0: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c3e0: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c3f0: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c400: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c410: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c420: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c430: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c440: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c450: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c460: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c470: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c480: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c490: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c4a0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c4b0: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c4c0: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c4d0: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c4e0: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c4f0: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c500: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c510: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c520: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c530: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c540: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c550: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c560: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c570: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c580: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c590: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c5a0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c5b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c5c0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c5d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c5e0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c5f0: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c600: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c610: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c620: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c630: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c640: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c650: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c660: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c670: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c680: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c690: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c6a0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c6b0: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c6c0: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c6d0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c6e0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c6f0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c700: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c710: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c720: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c730: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c740: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c750: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c760: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c770: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c780: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c790: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c7a0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c7b0: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c7c0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c7d0: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c7e0: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c7f0: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c800: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c810: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c820: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c830: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c840: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c850: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c860: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c870: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c880: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c890: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c8a0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c8b0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c8c0: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c8d0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c8e0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c8f0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c900: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c910: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c920: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c930: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c940: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c960: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c970: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c980: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c990: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c9a0: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c9b0: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c9c0: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c9d0: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c9e0: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c9f0: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
ca00: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
ca10: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
ca20: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
ca30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ca40: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
ca50: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
ca60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
ca70: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
ca80: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
ca90: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
caa0: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
cab0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
cac0: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
cad0: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
cae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
cb00: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
cb10: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
cb20: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
cb30: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
cb40: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
cb50: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cb60: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6c  pPager->fd);.#el
cb70: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
cb80: 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a 23  METER(pPager);.#
cb90: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
cba0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
cbb0: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
cbc0: 20 69 66 28 20 64 63 26 53 51 4c 49 54 45 5f 49   if( dc&SQLITE_I
cbd0: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
cbe0: 43 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  C ){.    return 
cbf0: 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
cc00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cc10: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
cc20: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53  E.  {.    int nS
cc30: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
cc40: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
cc50: 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
cc60: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
cc70: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
cc80: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
cc90: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
cca0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
ccb0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
ccc0: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
ccd0: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
cce0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
ccf0: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
cd00: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
cd10: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
cd20: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
cd30: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
cd40: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
cd50: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
cd60: 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a  pPager);.#endif.
cd70: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
cd80: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
cd90: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
cda0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
cdb0: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
cdc0: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
cdd0: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
cde0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
cdf0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
ce00: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
ce10: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
ce20: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
ce30: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
ce40: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
ce50: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
ce60: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
ce70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
ce80: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
ce90: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
cea0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
ceb0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
cec0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
ced0: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
cee0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
cef0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
cf00: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
cf10: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
cf20: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
cf30: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
cf40: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
cf50: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
cf60: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
cf70: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
cf80: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
cf90: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
cfa0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
cfb0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
cfc0: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
cfd0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
cfe0: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
cff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
d000: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
d010: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
d020: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
d030: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
d040: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
d050: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
d060: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
d070: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
d080: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
d090: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
d0a0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
d0b0: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
d0c0: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
d0d0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
d0e0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
d0f0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
d100: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
d110: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
d120: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
d130: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
d140: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d150: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
d160: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
d170: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
d180: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
d190: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
d1a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
d1b0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
d1c0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
d1d0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
d1e0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
d1f0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
d200: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
d210: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
d220: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
d230: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
d240: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
d250: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
d260: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
d270: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
d280: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
d290: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
d2a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
d2b0: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
d2c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d2d0: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
d2e0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
d2f0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
d300: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
d310: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
d320: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
d330: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
d340: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
d350: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
d360: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
d370: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
d380: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
d390: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
d3a0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
d3b0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
d3c0: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
d3d0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
d3e0: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
d3f0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
d400: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
d410: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
d420: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
d430: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
d440: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
d450: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
d460: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
d470: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d480: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
d490: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
d4a0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
d4b0: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
d4c0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
d4d0: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
d4e0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
d4f0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
d500: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
d510: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
d520: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
d530: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
d540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
d550: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d560: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
d570: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d580: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
d590: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
d5a0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
d5b0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
d5c0: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
d5d0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
d5e0: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
d5f0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
d600: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
d610: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
d620: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
d630: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
d640: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
d650: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d660: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
d670: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
d680: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
d690: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
d6a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
d6b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
d6c0: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
d6d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d6e0: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
d6f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
d700: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
d710: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
d720: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
d730: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
d740: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
d750: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
d760: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d770: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d780: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
d790: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
d7a0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
d7b0: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
d7c0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d7d0: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d7f0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
d800: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
d810: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
d820: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
d830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
d840: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
d850: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
d860: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
d890: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d8a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
d8b0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
d8c0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
d8d0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
d8e0: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
d8f0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d900: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d910: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d920: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d930: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d940: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d950: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d960: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d970: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d980: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d990: 6c 65 6e 3e 73 7a 4a 2d 31 36 0a 20 20 20 7c 7c  len>szJ-16.   ||
d9a0: 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53   len==0 .   || S
d9b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d9c0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d9d0: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
d9e0: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
d9f0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
da00: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
da10: 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29  Magic, 8, szJ-8)
da20: 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  ).   || memcmp(a
da30: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
da40: 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53  agic, 8).   || S
da50: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
da60: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
da70: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
da80: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a  n, szJ-16-len)).
da90: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
daa0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
dab0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
dac0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
dad0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
dae0: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
daf0: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
db00: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
db10: 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r[u];.  }.  if( 
db20: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
db30: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
db40: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
db50: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
db60: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
db70: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
db80: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
db90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
dba0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
dbb0: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
dbc0: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
dbd0: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
dbe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dbf0: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
dc00: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
dc10: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
dc20: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
dc30: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  len = 0;.  }.  z
dc40: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
dc50: 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e  0';.   .  return
dc60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
dc70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dc80: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65  offset of the se
dc90: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74  ctor boundary at
dca0: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   or immediately 
dcb0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
dcc0: 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65  e value in pPage
dcd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61  r->journalOff, a
dce0: 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72  ssuming a sector
dcf0: 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61   .** size of pPa
dd00: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
dd10: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  bytes..**.** i.e
dd20: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
dd30: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
dd40: 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c     Pager.journal
dd50: 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74  Off          Ret
dd60: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d  urn value.**   -
dd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd90: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32        0.**   512
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
dde0: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
ddf0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
de00: 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20     2000         
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
de20: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
de30: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  i64 journalHdrOf
de40: 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  fset(Pager *pPag
de50: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
de60: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
de70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de80: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
de90: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
dea0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
deb0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
dec0: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
ded0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
dee0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
def0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
df00: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
df10: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
df20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
df30: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
df40: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
df50: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65  ;.  return offse
df60: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
df70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
df80: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
df90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
dfa0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
dfb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
dfc0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f   no-op if the jo
dfd0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e  urnal file has n
dfe0: 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ot been written 
dff0: 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  to.** within the
e000: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
e010: 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61  tion (i.e. if Pa
e020: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  ger.journalOff==
e030: 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54  0)..**.** If doT
e040: 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a  runcate is non-z
e050: 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72  ero or the Pager
e060: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
e070: 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a  t variable is.**
e080: 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20   set to 0, then 
e090: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
e0a0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72  rnal file to zer
e0b0: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
e0c0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a   Otherwise,.** z
e0d0: 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20  ero the 28-byte 
e0e0: 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74  header at the st
e0f0: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
e100: 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68  al file. In eith
e110: 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20  er case, .** if 
e120: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
e130: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e140: 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
e150: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
e160: 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72  ely .** after wr
e170: 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  iting or truncat
e180: 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ing it..**.** If
e190: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
e1a0: 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74  zeLimit is set t
e1b0: 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f  o a positive, no
e1c0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e  n-zero value, an
e1d0: 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  d.** following t
e1e0: 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72  he truncation or
e1f0: 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62   zeroing describ
e200: 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a  ed above the siz
e210: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75  e of the .** jou
e220: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
e230: 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  es is larger tha
e240: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68  n this value, th
e250: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  en truncate the.
e260: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
e270: 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  to Pager.journal
e280: 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e  SizeLimit bytes.
e290: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
e2a0: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65  e does.** not ne
e2b0: 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20  ed to be synced 
e2c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
e2d0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
e2e0: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
e2f0: 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70  ccurs, abandon p
e300: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
e310: 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  turn the IO erro
e320: 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72  r code..** Other
e330: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  wise, return SQL
e340: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
e350: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
e360: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
e370: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
e380: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
e390: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e3c0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
e3d0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3e0: 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73  er->jfd) );.  as
e3f0: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a 6f  sert( !sqlite3Jo
e400: 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
e410: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
e420: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
e430: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
e440: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
e450: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e460: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
e470: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
e480: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
e490: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
e4a0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
e4b0: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
e4c0: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
e4d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e4e0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
e4f0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
e500: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e510: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e520: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
e530: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
e540: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
e550: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
e560: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
e570: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
e580: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
e590: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
e5a0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
e5b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e5c0: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
e5d0: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
e5e0: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
e5f0: 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
e600: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
e610: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
e620: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
e630: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
e640: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
e650: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
e660: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
e670: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
e680: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
e690: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
e6a0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
e6b0: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
e6c0: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
e6d0: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
e6e0: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
e6f0: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
e700: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
e710: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
e720: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
e730: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
e740: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
e750: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
e760: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
e770: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
e780: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
e790: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
e7a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
e7b0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
e7c0: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
e7d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e7e0: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
e7f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e800: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
e810: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
e820: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
e830: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
e840: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
e850: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
e860: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
e870: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e880: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
e890: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
e8a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
e8b0: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
e8c0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e8d0: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
e8e0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
e8f0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
e900: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
e910: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
e920: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
e930: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
e940: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
e950: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
e960: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
e970: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
e980: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
e990: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
e9a0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
e9b0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
e9c0: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
e9d0: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
e9e0: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
e9f0: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
ea00: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
ea10: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
ea20: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
ea30: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
ea40: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
ea50: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
ea60: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
ea70: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
ea80: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
ea90: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
eaa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
eab0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
eac0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ead0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
eae0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
eaf0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
eb00: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
eb10: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
eb20: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
eb30: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
eb40: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
eb50: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
eb60: 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61  eader = (u32)pPa
eb70: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a  ger->pageSize;/*
eb80: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
eb90: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
eba0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
ebb0: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ebd0: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
ebe0: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
ebf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
ec20: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
ec30: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
ec40: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
ec50: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
ec60: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
ec70: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
ec80: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
ec90: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
eca0: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
ecb0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ecc0: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
ecd0: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
ece0: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
ecf0: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
ed00: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
ed10: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
ed20: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
ed30: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
ed40: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
ed50: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
ed60: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
ed70: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
ed80: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
ed90: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
eda0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
edb0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
edc0: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
edd0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
ede0: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
edf0: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
ee00: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ee10: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
ee20: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
ee30: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
ee40: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
ee50: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
ee60: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
ee70: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
ee80: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
ee90: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
eea0: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
eeb0: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
eec0: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
eed0: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
eee0: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
eef0: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
ef00: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
ef10: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
ef20: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
ef30: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
ef40: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
ef50: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
ef60: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
ef70: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
ef80: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
ef90: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
efa0: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
efb0: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
efc0: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
efd0: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
efe0: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
eff0: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
f000: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
f010: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
f020: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
f030: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
f040: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
f050: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
f060: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
f070: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
f080: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
f090: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
f0a0: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
f0b0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
f0c0: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
f0d0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
f0e0: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
f0f0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
f100: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
f110: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
f120: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
f130: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
f140: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
f150: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
f160: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
f170: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
f180: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
f190: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
f1a0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
f1b0: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
f1c0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
f1d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
f1e0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
f1f0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
f200: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
f210: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
f220: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
f230: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
f240: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
f250: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
f260: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
f270: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
f280: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
f290: 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61  ->noSync || (pPa
f2a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
f2b0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
f2c0: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
f2d0: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
f2e0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
f2f0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
f300: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
f310: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
f320: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
f330: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
f340: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
f350: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
f360: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f370: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f380: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
f390: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
f3a0: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
f3b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
f3c0: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
f3d0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
f3e0: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
f3f0: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20  nitializer */ . 
f400: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
f410: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
f420: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
f430: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f440: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
f450: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f460: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
f470: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
f480: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
f490: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
f4a0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
f4b0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f4c0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f4d0: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
f4e0: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
f4f0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
f500: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
f510: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
f520: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f530: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f540: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
f550: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
f560: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
f570: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
f580: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f590: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f5a0: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
f5b0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
f5c0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
f5d0: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
f5e0: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
f5f0: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
f600: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
f610: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
f620: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
f630: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
f640: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
f650: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
f660: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
f670: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
f680: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
f690: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
f6a0: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
f6b0: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
f6c0: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
f6d0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f6e0: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
f6f0: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
f700: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f710: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
f720: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
f730: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
f740: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
f750: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
f760: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
f770: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
f780: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
f790: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
f7a0: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
f7b0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
f7c0: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
f7d0: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
f7e0: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
f7f0: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
f800: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
f810: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
f820: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
f830: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
f840: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
f850: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
f860: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
f870: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
f880: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
f890: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
f8a0: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
f8b0: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
f8c0: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
f8d0: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
f8e0: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
f8f0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
f900: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
f910: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
f920: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
f930: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
f940: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
f950: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
f960: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
f970: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
f980: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
f990: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
f9a0: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
f9b0: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
f9c0: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
f9d0: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
f9e0: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
f9f0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
fa00: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
fa10: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
fa20: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
fa30: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
fa40: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
fa50: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
fa60: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
fa70: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
fa80: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
fa90: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
faa0: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
fab0: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
fac0: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
fad0: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
fae0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
faf0: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
fb00: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
fb10: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
fb20: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
fb30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fb40: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
fb50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fb60: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
fb70: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
fb80: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
fb90: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
fba0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
fbb0: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
fbc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
fbd0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
fbe0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
fbf0: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
fc00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fc10: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
fc20: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
fc30: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
fc40: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
fc50: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
fc60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
fc70: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
fc80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
fc90: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
fca0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
fcb0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
fcc0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
fcd0: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
fce0: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
fcf0: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
fd00: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
fd10: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
fd20: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
fd30: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
fd40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fd50: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
fd60: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
fd70: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
fd80: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
fd90: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
fda0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
fdb0: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
fdc0: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
fdd0: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
fde0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
fdf0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
fe00: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
fe10: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
fe20: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
fe30: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
fe40: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
fe50: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
fe60: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fe70: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
fe80: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
fe90: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
fea0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
feb0: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
fec0: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
fed0: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
fee0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
fef0: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
ff00: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
ff10: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
ff20: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
ff30: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
ff40: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
ff50: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
ff60: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
ff70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
ff80: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
ff90: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ffb0: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
ffc0: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
ffd0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fff0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
10000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
10010 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
10020 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
10030 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
10040 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
10050 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
10060 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
10070 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
10080 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
10090 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
100a0 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
100b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
100e0 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
100f0 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
10100 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
10110 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
10120 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
10130 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10150 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
10160 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
10170 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
10180 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
10190 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
101a0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
101b0 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
101c0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
101d0 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
101e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
101f0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
10200 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
10210 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
10220 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
10230 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
10240 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
10250 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
10260 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
10270 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
10280 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
10290 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
102a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
102b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
102c0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
102d0 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
102e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
102f0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
10300 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10310 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10320 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
10330 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
10340 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
10350 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
10360 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
10370 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
10380 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
10390 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
103a0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
103b0 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
103c0 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
103d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
103e0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
103f0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
10400 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
10410 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
10420 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
10430 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
10440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10450 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
10460 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
10470 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
10480 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
10490 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
104a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
104b0 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
104c0 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
104d0 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
104e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
104f0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
10500 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10510 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
10520 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
10530 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
10540 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
10550 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
10560 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
10570 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
10580 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
10590 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
105a0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
105b0 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
105c0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
105d0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
105e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
105f0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10600 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10610 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
10620 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
10630 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10640 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
10650 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10660 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
10670 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
10680 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10690 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
106a0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
106b0 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
106c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
106d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
106e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
106f0 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
10700 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
10710 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
10720 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
10730 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
10740 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
10750 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
10760 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
10770 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
10780 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  header */..    /
10790 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
107a0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
107b0 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
107c0 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
107d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
107e0 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
107f0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10800 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
10810 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
10820 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
10830 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
10840 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10850 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
10860 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
10870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10880 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69   }..    /* Versi
10890 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
108a0 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74  ior to 3.5.8 set
108b0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66   the page-size f
108c0 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ield of the.    
108d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
108e0 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68  r to zero. In th
108f0 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20  is case, assume 
10900 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70  that the Pager.p
10910 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76  ageSize.    ** v
10920 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61  ariable is alrea
10930 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  dy set to the co
10940 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e  rrect page size.
10950 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10960 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a  iPageSize==0 ){.
10970 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20        iPageSize 
10980 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
10990 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ze;.    }..    /
109a0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
109b0 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
109c0 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  m the page-size 
109d0 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
109e0 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72  fields.    ** ar
109f0 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
10a00 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27  To be 'in range'
10a10 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65  , both values ne
10a20 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
10a30 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67  .    ** of two g
10a40 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
10a50 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33  qual to 512 or 3
10a60 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74  2, and not great
10a70 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20  er than their . 
10a80 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65     ** respective
10a90 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61   compile time ma
10aa0 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20  ximum limits..  
10ab0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10ac0 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20  geSize<512      
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69              || i
10ae0 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20  SectorSize<32.  
10af0 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e     || iPageSize>
10b00 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10b10 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53  SIZE || iSectorS
10b20 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
10b30 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50  IZE.     || ((iP
10b40 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
10b50 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28  Size)!=0   || ((
10b60 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69  iSectorSize-1)&i
10b70 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a  SectorSize)!=0 .
10b80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
10b90 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68  If the either th
10ba0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73  e page-size or s
10bb0 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68  ector-size in th
10bc0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10bd0 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e   is .      ** in
10be0 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20  valid, then the 
10bf0 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
10c00 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  te the journal-h
10c10 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20  eader must have 
10c20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65  .      ** crashe
10c30 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61  d before the hea
10c40 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20  der was synced. 
10c50 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f  In this case sto
10c60 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20  p reading .     
10c70 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10c80 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
10c90 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
10ca0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
10cb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
10cc0 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  te the page-size
10cd0 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
10ce0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
10cf0 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  e journal. .    
10d00 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73  ** Use a testcas
10d10 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b  e() macro to mak
10d20 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c  e sure that mall
10d30 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69  oc failure withi
10d40 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53  n .    ** PagerS
10d50 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20  etPagesize() is 
10d60 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tested..    */. 
10d70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10d80 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10d90 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
10da0 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  ze, -1);.    tes
10db0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
10dc0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
10dd0 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
10de0 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
10df0 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
10e00 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
10e10 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
10e20 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
10e30 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
10e40 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
10e50 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
10e60 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
10e70 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
10e80 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
10e90 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
10ea0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
10eb0 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
10ec0 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
10ed0 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
10ee0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
10ef0 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
10f00 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
10f10 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
10f20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
10f30 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
10f40 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
10f50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10f60 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
10f70 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
10f80 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
10f90 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
10fa0 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
10fb0 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
10fc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
10fd0 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
10fe0 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
10ff0 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
11000 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
11010 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
11020 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
11030 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
11040 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
11050 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
11060 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
11070 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
11080 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
11090 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
110a0 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
110b0 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
110c0 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
110d0 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
110e0 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
110f0 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
11100 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
11110 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
11120 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
11130 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
11140 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
11150 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11160 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
11170 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
11180 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
11190 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
111a0 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
111b0 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
111c0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
111d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
111e0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
111f0 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
11200 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
11210 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
11220 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
11230 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
11240 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
11250 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
11260 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
11270 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
11280 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
11290 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
112a0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
112b0 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
112c0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
112d0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
112e0 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
112f0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
11300 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
11310 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
11320 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11340 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11350 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
11380 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
11390 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
113c0 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
113d0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
113e0 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11400 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
11410 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
11420 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
11450 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
11460 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
11470 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
11480 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
11490 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
114a0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
114b0 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  !zMaster .   || 
114c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
114d0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
114e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
114f0 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61    || !isOpen(pPa
11500 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20  ger->jfd).  ){. 
11510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11520 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
11530 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
11540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11550 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
11560 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
11570 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
11580 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
11590 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
115a0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
115b0 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
115c0 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
115d0 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
115e0 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
115f0 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
11600 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
11610 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
11620 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
11630 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
11640 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
11650 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
11660 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11670 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
11680 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
11690 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
116a0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
116b0 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
116c0 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
116d0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
116e0 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
116f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11700 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
11710 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
11720 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
11730 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11740 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
11750 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11760 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
11770 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
11780 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
11790 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
117a0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
117b0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
117c0 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
117d0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
117e0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
117f0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
11800 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
11810 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
11820 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
11830 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11840 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
11850 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
11860 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11870 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11880 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11890 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
118a0 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
118b0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
118c0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
118d0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
118e0 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
118f0 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
11900 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
11910 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
11920 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
11930 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20 20  c, 8,.          
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b 34         iHdrOff+4
11960 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
11970 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11980 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
11990 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
119a0 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
119b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
119c0 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
119d0 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
119e0 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
119f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
11a00 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
11a10 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
11a20 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
11a30 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
11a40 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
11a50 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
11a60 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
11a70 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
11a80 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
11a90 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
11aa0 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
11ab0 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
11ac0 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
11ad0 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
11ae0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
11af0 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
11b00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
11b10 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
11b20 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
11b30 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
11b40 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
11b50 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
11b60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
11b70 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
11b80 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
11b90 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
11ba0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
11bb0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11bc0 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
11bd0 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
11be0 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
11bf0 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
11c00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
11c10 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
11c20 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
11c30 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
11c40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11c50 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20  .** Discard the 
11c60 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
11c70 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
11c80 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a   page-cache..*/.
11c90 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11ca0 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
11cb0 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72  Pager){.  pPager
11cc0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
11cd0 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  ;.  sqlite3Backu
11ce0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
11cf0 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c  >pBackup);.  sql
11d00 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
11d10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
11d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11d30 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44  n the pPager->iD
11d40 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65  ataVersion value
11d50 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50  .*/.u32 sqlite3P
11d60 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28  agerDataVersion(
11d70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11d80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11d90 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
11da0 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  PEN );.  return 
11db0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11dc0 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  sion;.}../*.** F
11dd0 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
11de0 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
11df0 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
11e00 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
11e10 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
11e20 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11e30 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11e40 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11e50 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11e60 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
11e70 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11e80 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
11e90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11ea0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
11eb0 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
11ec0 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ee0 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
11ef0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
11f00 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
11f10 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11f20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11f30 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
11f40 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11f50 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
11f60 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
11f70 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
11f80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
11f90 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
11fa0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
11fb0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73  Memory(pPager->s
11fc0 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
11fd0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
11fe0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
11ff0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
12000 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
12010 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
12020 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
12030 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
12040 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12050 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
12060 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
12070 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
12080 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
12090 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
120a0 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
120b0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
120c0 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
120d0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
120e0 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
120f0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
12100 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
12110 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12120 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
12130 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
12140 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
12150 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12170 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12180 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12190 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
121a0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
121b0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
121c0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
121d0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
121e0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
121f0 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
12200 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
12210 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
12220 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
12230 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
12240 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
12250 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
12260 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
12270 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
12280 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
12290 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
122a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
122b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
122c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
122d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
122e0 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20  ONCURRENT./*.** 
122f0 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  If they are not 
12300 61 6c 72 65 61 64 79 2c 20 62 65 67 69 6e 20 72  already, begin r
12310 65 63 6f 72 64 69 6e 67 20 61 6c 6c 20 70 61 67  ecording all pag
12320 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
12330 20 70 61 67 65 72 20 6c 61 79 65 72 0a 2a 2a 20   pager layer.** 
12340 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
12350 79 65 72 20 54 68 69 73 20 69 73 20 75 73 65 64  yer This is used
12360 20 62 79 20 63 6f 6e 63 75 72 72 65 6e 74 20 74   by concurrent t
12370 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 52 65 74  ransactions. Ret
12380 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
12390 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
123a0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
123b0 6f 72 20 63 6f 64 65 20 28 53 51 4c 49 54 45 5f  or code (SQLITE_
123c0 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20 65 72 72  NOMEM) if an err
123d0 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  or.** occurs..*/
123e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
123f0 72 42 65 67 69 6e 43 6f 6e 63 75 72 72 65 6e 74  rBeginConcurrent
12400 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12410 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12420 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
12430 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d 30  ger->pAllRead==0
12440 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12450 70 41 6c 6c 52 65 61 64 20 3d 20 73 71 6c 69 74  pAllRead = sqlit
12460 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
12470 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
12480 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
12490 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
124a0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  >dbSize;.    if(
124b0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
124c0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  d==0 ){.      rc
124d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
124e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
124f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64  urn rc;.}../* !d
12500 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12510 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
12520 2a 0a 2a 2a 20 53 74 6f 70 20 72 65 63 6f 72 64  *.** Stop record
12530 69 6e 67 20 61 6c 6c 20 70 61 67 65 73 20 72 65  ing all pages re
12540 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
12550 72 20 6c 61 79 65 72 20 62 79 20 74 68 65 20 62  r layer by the b
12560 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61  -tree layer.** a
12570 6e 64 20 64 69 73 63 61 72 64 20 61 6e 79 20 63  nd discard any c
12580 75 72 72 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a  urrent records..
12590 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
125a0 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e  agerEndConcurren
125b0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
125c0 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
125d0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
125e0 3e 70 41 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50  >pAllRead);.  pP
125f0 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d  ager->pAllRead =
12600 20 30 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e   0;.}../* !defin
12610 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
12620 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
12630 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
12640 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
12650 69 6e 20 77 61 6c 20 6d 6f 64 65 2e 20 46 61 6c  in wal mode. Fal
12660 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
12670 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12680 72 49 73 57 61 6c 28 50 61 67 65 72 20 2a 70 50  rIsWal(Pager *pP
12690 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
126a0 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 3b  pPager->pWal!=0;
126b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
126c0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
126d0 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72  ENT */../*.** Fr
126e0 65 65 20 74 68 65 20 50 61 67 65 72 2e 70 49 6e  ee the Pager.pIn
126f0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 61 67 65  Journal and Page
12700 72 2e 70 41 6c 6c 52 65 61 64 20 62 69 74 76 65  r.pAllRead bitve
12710 63 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74  c objects..*/.st
12720 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
12730 72 65 65 42 69 74 76 65 63 73 28 50 61 67 65 72  reeBitvecs(Pager
12740 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
12750 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
12760 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
12770 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
12780 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
12790 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  .  sqlite3PagerE
127a0 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 50 61  ndConcurrent(pPa
127b0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ger);.}../*.** T
127c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
127d0 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
127e0 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
127f0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f  sive mode and no
12800 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f  t.** in the ERRO
12810 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
12820 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20  se, it switches 
12830 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47  the pager to PAG
12840 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65  ER_OPEN.** state
12850 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
12860 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
12870 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
12880 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61  mode, the databa
12890 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f  se file is.** co
128a0 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65  mpletely unlocke
128b0 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  d. If the file i
128c0 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74  s unlocked and t
128d0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  he file-system d
128e0 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62  oes.** not exhib
128f0 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42  it the UNDELETAB
12900 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f  LE_WHEN_OPEN pro
12910 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e  perty, the journ
12920 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c  al file is.** cl
12930 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f  osed (if it is o
12940 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pen)..**.** If t
12950 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45  he pager is in E
12960 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
12970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12980 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a   called, the .**
12990 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
129a0 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65   pager cache are
129b0 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72   discarded befor
129c0 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b  e switching back
129d0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e   to .** the OPEN
129e0 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65   state. Regardle
129f0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
12a00 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
12a10 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20  clusive-mode.** 
12a20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72  or not, any jour
12a30 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e  nal file left in
12a40 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
12a50 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
12a60 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  .** as a hot-jou
12a70 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
12a80 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69  back the next ti
12a90 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  me a read-transa
12aa0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e  ction.** is open
12ab0 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62  ed (by this or b
12ac0 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e  y any other conn
12ad0 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74  ection)..*/.stat
12ae0 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
12af0 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
12b00 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  er){..  assert( 
12b10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12b20 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
12b30 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
12b40 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
12b50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  EN .       || pP
12b60 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
12b70 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a  GER_ERROR .  );.
12b80 0a 20 20 70 61 67 65 72 46 72 65 65 42 69 74 76  .  pagerFreeBitv
12b90 65 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ecs(pPager);.  r
12ba0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
12bb0 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
12bc0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
12bd0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
12be0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
12bf0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
12c00 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64     sqlite3WalEnd
12c10 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
12c20 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
12c30 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12c40 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12c50 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
12c60 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
12c70 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
12c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c90 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
12ca0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62   code returned b
12cb0 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  y pagerUnlockDb(
12cc0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63  ) */.    int iDc
12cd0 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72   = isOpen(pPager
12ce0 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44  ->fd)?sqlite3OsD
12cf0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
12d00 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
12d10 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  :0;..    /* If t
12d20 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
12d30 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65  tem support dele
12d40 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c  tion of open fil
12d50 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  es, then.    ** 
12d60 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
12d70 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
12d80 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
12d90 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69  e lock.  Otherwi
12da0 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65  se.    ** anothe
12db0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
12dc0 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
12dd0 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65  elete might dele
12de0 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  te the file.    
12df0 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ** out from unde
12e00 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
12e10 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12e20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
12e30 52 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  RY   & 5)!=1 );.
12e40 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12e50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
12e60 46 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  FF      & 5)!=1 
12e70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12e80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12e90 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21  E_WAL      & 5)!
12ea0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12eb0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12ec0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20  MODE_DELETE   & 
12ed0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12ee0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12ef0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12f00 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12f10 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12f20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
12f30 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ST  & 5)==1 );. 
12f40 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26     if( 0==(iDc &
12f50 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
12f60 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
12f70 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d  PEN).     || 1!=
12f80 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
12f90 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b  Mode & 5).    ){
12fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12fb0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
12fc0 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
12fd0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
12fe0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12ff0 74 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c  tate and the cal
13000 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  l to unlock the 
13010 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
13020 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20  file fails, set 
13030 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
13040 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
13050 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
13060 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74  t.    ** above t
13070 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55  he #define for U
13080 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
13090 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
130a0 66 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a  f why this.    *
130b0 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  * is necessary..
130c0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
130d0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
130e0 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ager, NO_LOCK);.
130f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13100 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
13110 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
13120 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50  RROR ){.      pP
13130 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e  ager->eLock = UN
13140 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20  KNOWN_LOCK;.    
13150 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  }..    /* The pa
13160 67 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65  ger state may be
13170 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41   changed from PA
13180 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47  GER_ERROR to PAG
13190 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20  ER_OPEN here.   
131a0 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61   ** without clea
131b0 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63  ring the error c
131c0 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74  ode. This is int
131d0 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65  entional - the e
131e0 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  rror.    ** code
131f0 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20   is cleared and 
13200 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20  the cache reset 
13210 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c  in the block bel
13220 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
13230 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13240 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  rrCode || pPager
13250 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
13260 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61  ERROR );.    pPa
13270 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
13280 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
13290 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
132a0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a  AGER_OPEN;.  }..
132b0 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
132c0 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
132d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
132e0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
132f0 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75  nnot be.  ** tru
13300 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
13310 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
13320 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
13330 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c  es to the pager,
13340 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66  .  ** it can saf
13350 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f  ely move back to
13360 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
13370 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  e. This happens 
13380 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72  in both.  ** nor
13390 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76  mal and exclusiv
133a0 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  e-locking mode..
133b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
133c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
133d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
133e0 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
133f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
13400 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
13410 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  tempFile==0 ){. 
13420 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
13430 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
13440 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13450 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
13460 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
13470 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
13480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13490 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
134a0 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  = (isOpen(pPager
134b0 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f  ->jfd) ? PAGER_O
134c0 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44  PEN : PAGER_READ
134d0 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
134e0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
134f0 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
13500 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
13510 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  d, 0, 0);.    pP
13520 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
13530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73  SQLITE_OK;.    s
13540 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
13550 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70  Pager);.  }..  p
13560 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13570 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
13580 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
13590 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
135a0 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
135b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
135c0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
135d0 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
135e0 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
135f0 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
13600 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
13610 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
13620 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
13630 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
13640 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
13650 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
13660 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
13670 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
13680 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
13690 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
136a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
136b0 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
136c0 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
136d0 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
136e0 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
136f0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
13700 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
13710 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
13720 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
13730 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
13740 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
13750 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
13760 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
13770 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
13780 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
13790 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
137a0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
137b0 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
137c0 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
137d0 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
137e0 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
137f0 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
13800 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
13810 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
13820 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
13830 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
13840 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
13850 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
13860 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
13870 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
13880 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
13890 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
138a0 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
138b0 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
138c0 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
138d0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
138e0 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
138f0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
13900 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
13910 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
13920 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
13930 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
13940 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
13950 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
13960 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
13970 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
13980 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
13990 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
139a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
139b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
139c0 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
139d0 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
139e0 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
139f0 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
13a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13a10 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
13a20 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
13a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
13a40 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
13a50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
13a60 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
13a70 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
13a80 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
13a90 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
13aa0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
13ab0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
13ac0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
13ad0 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
13ae0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
13af0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
13b00 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
13b10 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
13b20 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
13b30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13b40 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
13b50 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
13b60 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
13b70 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
13b80 68 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  he write transac
13b90 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61  tion open on pPa
13ba0 67 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ger is being com
13bb0 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d  mitted (bCommit=
13bc0 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64  =1).** or rolled
13bd0 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d   back (bCommit==
13be0 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  0)..**.** Return
13bf0 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c   TRUE if and onl
13c00 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70  y if all dirty p
13c10 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66  ages should be f
13c20 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a  lushed to disk..
13c30 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a  **.** Rules:.**.
13c40 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d  **   *  For non-
13c50 54 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20  TEMP databases, 
13c60 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64  always sync to d
13c70 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  isk.  This is ne
13c80 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20  cessary.**      
13c90 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  for transactions
13ca0 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a   to be durable..
13cb0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20  **.**   *  Sync 
13cc0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e  TEMP database on
13cd0 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28  ly on a COMMIT (
13ce0 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20  not a ROLLBACK) 
13cf0 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67  when the backing
13d00 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61  .**      file ha
13d10 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61  s been created a
13d20 6c 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70  lready (via a sp
13d30 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65  ill on pagerStre
13d40 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20  ss()) and.**    
13d50 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65    when the numbe
13d60 72 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  r of dirty pages
13d70 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65   in memory excee
13d80 64 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f  ds 25% of the to
13d90 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68  tal.**      cach
13da0 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  e size..*/.stati
13db0 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68  c int pagerFlush
13dc0 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  OnCommit(Pager *
13dd0 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d  pPager, int bCom
13de0 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67  mit){.  if( pPag
13df0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
13e00 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
13e10 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74  ( !bCommit ) ret
13e20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73  urn 0;.  if( !is
13e30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
13e40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
13e50 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43  eturn (sqlite3PC
13e60 61 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79  achePercentDirty
13e70 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13e80 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )>=25);.}../*.**
13e90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
13ea0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
13eb0 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
13ec0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
13ed0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
13ee0 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
13ef0 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
13f00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
13f10 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
13f20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
13f30 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
13f40 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
13f50 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
13f60 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
13f70 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
13f80 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
13f90 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
13fa0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
13fb0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
13fc0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
13fd0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
13fe0 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
13ff0 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
14000 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
14010 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
14020 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
14030 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
14040 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
14050 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
14060 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
14070 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
14080 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
14090 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
140a0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
140b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
140c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
140d0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
140e0 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
140f0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
14100 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
14110 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
14120 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
14130 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
14140 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
14150 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
14160 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
14170 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
14180 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
14190 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
141a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
141b0 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
141c0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
141d0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
141e0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
141f0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
14200 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
14210 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
14220 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
14230 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
14240 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
14250 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
14260 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
14270 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
14280 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
14290 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
142a0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
142b0 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
142c0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
142d0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
142e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
142f0 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
14300 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
14310 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
14320 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
14330 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
14340 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
14350 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
14360 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
14370 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
14380 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
14390 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
143a0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
143b0 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
143c0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
143d0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
143e0 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
143f0 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
14400 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
14410 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
14420 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
14430 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
14440 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
14450 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
14460 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
14470 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
14480 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
14490 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
144a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
144b0 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
144c0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
144d0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
144e0 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
144f0 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
14500 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
14510 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
14520 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
14530 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
14540 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
14550 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
14560 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
14570 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
14580 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
14590 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
145a0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
145b0 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
145c0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
145d0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
145e0 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
145f0 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
14600 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
14610 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
14620 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
14630 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
14640 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
14650 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
14660 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
14670 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14680 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
14690 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
146a0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
146b0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
146c0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
146d0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
146e0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
146f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14700 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
14710 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
14720 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
14730 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14740 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
14750 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
14760 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
14770 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14780 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
14790 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
147a0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
147b0 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
147c0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
147d0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
147e0 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
147f0 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
14800 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
14810 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
14820 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
14830 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
14840 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
14850 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
14860 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
14870 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f  sMaster, int bCo
14880 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  mmit){.  int rc 
14890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
148a0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
148b0 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  from journal fin
148c0 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74  alization operat
148d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ion */.  int rc2
148e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
148f0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
14900 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c  from db file unl
14910 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ock operation */
14920 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  ..  /* Do nothin
14930 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64  g if the pager d
14940 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
14950 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
14960 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61  action.  ** or a
14970 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
14980 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75  ED lock. This fu
14990 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
149a0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a  lled when there.
149b0 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65    ** is no write
149c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
149d0 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56  ive but a RESERV
149e0 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
149f0 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20  ck is.  ** held 
14a00 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d  under two circum
14a10 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20  stances:.  **.  
14a20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20  **   1. After a 
14a30 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a  successful hot-j
14a40 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
14a50 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69   it is called wi
14a60 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74  th.  **      eSt
14a70 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20  ate==PAGER_NONE 
14a80 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14a90 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a  SIVE_LOCK..  **.
14aa0 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63    **   2. If a c
14ab0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c  onnection with l
14ac0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14ad0 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e  usive holding an
14ae0 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a   EXCLUSIVE .  **
14af0 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63        lock switc
14b00 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b  hes back to lock
14b10 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20  ing_mode=normal 
14b20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65  and then execute
14b30 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65  s a.  **      re
14b40 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ad-transaction, 
14b50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
14b60 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74   called with eSt
14b70 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
14b80 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64  R .  **      and
14b90 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
14ba0 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  E_LOCK when the 
14bb0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
14bc0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f   is closed..  */
14bd0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
14be0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14bf0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
14c00 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
14c10 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
14c20 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14c30 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49  eState<PAGER_WRI
14c40 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50  TER_LOCKED && pP
14c50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45  ager->eLock<RESE
14c60 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
14c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14c80 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73  K;.  }..  releas
14c90 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
14ca0 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
14cb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
14cc0 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
14cd0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a  >pInJournal==0 .
14ce0 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65        || (sqlite
14cf0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
14d00 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
14d10 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
14d20 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a  P_BATCH_ATOMIC).
14d30 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65    );.  if( isOpe
14d40 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
14d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
14d60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
14d70 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
14d80 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
14d90 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
14da0 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
14db0 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14dc0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
14dd0 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
14de0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14df0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14e00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a  MODE_MEMORY ); *
14e10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
14e20 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14e30 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
14e40 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14e50 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14e60 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
14e70 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
14e80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14e90 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
14ea0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14ec0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14ed0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
14ee0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
14ef0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14f00 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14f10 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
14f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
14f30 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69   sure the new fi
14f40 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74  le size is writt
14f50 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64  en into the inod
14f60 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  e right away..  
14f70 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
14f80 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wise the journal
14f90 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74   might resurrect
14fa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
14fb0 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20  er loss and.    
14fc0 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
14fd0 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74  he last transact
14fe0 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ion to roll back
14ff0 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20  .  See.         
15000 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a   ** https://bugz
15010 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67  illa.mozilla.org
15020 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
15030 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20  =1072773.       
15040 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
15050 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
15060 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
15070 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
15080 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
15090 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
150a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
150b0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
150c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
150d0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
150e0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
150f0 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
15100 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
15110 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15120 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
15130 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
15140 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
15150 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
15160 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
15170 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  er||pPager->temp
15180 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61  File);.      pPa
15190 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
151a0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
151b0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
151c0 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
151d0 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
151e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
151f0 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
15200 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
15210 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
15220 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
15230 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
15240 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
15250 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
15260 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
15270 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
15280 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
15290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
152a0 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
152b0 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
152c0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ry journal..    
152d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62    */.      int b
152e0 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72  Delete = !pPager
152f0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
15300 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15310 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
15320 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d  ry(pPager->jfd)=
15330 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
15340 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
15350 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
15360 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
15370 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
15380 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15390 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
153a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
153b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
153c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
153d0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
153e0 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
153f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15400 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
15410 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
15420 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  bDelete ){.     
15430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15440 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
15450 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
15460 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
15470 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20  extraSync);.    
15480 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
15490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
154a0 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
154b0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
154c0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
154d0 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
154e0 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
154f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
15500 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
15510 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
15520 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
15530 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
15540 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
15550 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  kup(pPager, 1);.
15560 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
15570 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d     p->pageHash =
15580 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
15590 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
155a0 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ll(p);.    }.  }
155b0 0a 23 65 6e 64 69 66 0a 0a 20 20 70 61 67 65 72  .#endif..  pager
155c0 46 72 65 65 42 69 74 76 65 63 73 28 70 50 61 67  FreeBitvecs(pPag
155d0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  er);.  pPager->n
155e0 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Rec = 0;.  if( r
155f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15600 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
15610 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d   pagerFlushOnCom
15620 6d 69 74 28 70 50 61 67 65 72 2c 20 62 43 6f 6d  mit(pPager, bCom
15630 6d 69 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  mit) ){.      sq
15640 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
15650 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
15660 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  che);.    }else{
15670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
15680 61 63 68 65 43 6c 65 61 72 57 72 69 74 61 62 6c  acheClearWritabl
15690 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
156a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
156b0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
156c0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
156d0 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
156e0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
156f0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
15700 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ger) ){.    /* D
15710 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74  rop the WAL writ
15720 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20  e-lock, if any. 
15730 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e  Also, if the con
15740 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a  nection was in .
15750 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d      ** locking_m
15760 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
15770 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
15780 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58  ger, drop the EX
15790 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20  CLUSIVE .    ** 
157a0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
157b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
157c0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d      */.    rc2 =
157d0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72   sqlite3WalEndWr
157e0 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
157f0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
15800 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53    assert( rc2==S
15810 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65  QLITE_OK );.  }e
15820 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
15830 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
15840 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69   && pPager->dbFi
15850 6c 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64  leSize>pPager->d
15860 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  bSize ){.    /* 
15870 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
15880 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74  aken when commit
15890 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
158a0 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a  on in rollback-j
158b0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f  ournal.    ** mo
158c0 64 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  de if the databa
158d0 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  se file on disk 
158e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
158f0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
15900 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69  e..    ** At thi
15910 73 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72  s point the jour
15920 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e  nal has been fin
15930 61 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74  alized and the t
15940 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
15950 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
15960 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74  committed, but t
15970 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
15980 6b 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  k is still held 
15990 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  on the.    ** fi
159a0 6c 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66  le. So it is saf
159b0 65 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  e to truncate th
159c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
159d0 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20  to its minimum. 
159e0 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73     ** required s
159f0 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ize.  */.    ass
15a00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
15a10 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15a20 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  CK );.    rc = p
15a30 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
15a40 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ager, pPager->db
15a50 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Size);.  }..  if
15a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15a70 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73  && bCommit && is
15a80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
15a90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15aa0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
15ab0 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
15ac0 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49  LITE_FCNTL_COMMI
15ad0 54 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a  T_PHASETWO, 0);.
15ae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15af0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
15b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15b10 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
15b20 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
15b30 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
15b40 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
15b50 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
15b60 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
15b70 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
15b80 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
15b90 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
15ba0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15bb0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
15bc0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
15bd0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
15be0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
15bf0 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
15c00 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
15c10 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
15c20 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
15c30 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
15c40 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
15c50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
15c60 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
15c70 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
15c80 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
15c90 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
15ca0 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
15cb0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
15cc0 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
15cd0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
15ce0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
15cf0 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
15d00 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
15d10 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
15d20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
15d30 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
15d40 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
15d50 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
15d60 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
15d70 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
15d80 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
15d90 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
15da0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
15db0 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15dc0 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
15dd0 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
15de0 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
15df0 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
15e00 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
15e10 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
15e20 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
15e30 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
15e40 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
15e50 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
15e60 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
15e70 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15e80 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
15e90 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15ea0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
15eb0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
15ec0 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
15ed0 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
15ee0 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
15ef0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
15f00 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
15f10 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
15f20 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
15f30 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
15f40 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
15f50 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
15f60 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
15f70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15f80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
15f90 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
15fa0 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
15fb0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
15fc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
15fd0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
15fe0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
15ff0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
16000 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16010 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
16020 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
16030 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
16040 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
16050 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
16060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16070 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
16080 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16090 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
160a0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
160b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
160c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
160d0 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
160e0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
160f0 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ion(pPager, 0, 0
16100 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
16110 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
16120 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  er);.}../*.** Pa
16130 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
16140 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
16150 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
16160 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
16170 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
16180 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
16190 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
161a0 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
161b0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
161c0 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
161d0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
161e0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
161f0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
16200 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
16210 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
16220 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
16230 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
16240 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
16250 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
16260 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
16270 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
16280 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
16290 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
162a0 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
162b0 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
162c0 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
162d0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
162e0 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
162f0 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
16300 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
16310 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
16320 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
16330 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
16340 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
16350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
16360 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
16370 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
16380 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
16390 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
163a0 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
163b0 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
163c0 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
163d0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
163e0 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
163f0 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
16400 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
16410 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
16420 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
16430 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
16440 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
16450 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
16460 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
16470 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
16480 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
16490 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
164a0 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
164b0 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
164c0 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
164d0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
164e0 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
164f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
16500 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
16510 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
16520 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
16530 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
16540 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
16550 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
16560 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16570 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
16580 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
16590 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
165a0 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
165b0 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
165c0 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
165d0 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
165e0 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
165f0 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
16600 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
16610 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
16620 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
16630 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
16640 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16650 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
16660 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
16670 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
16680 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
16690 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
166a0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
166b0 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
166c0 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
166d0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
16700 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
16710 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
16720 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16730 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
16740 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
16750 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
16760 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
16770 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16780 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16790 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
167a0 65 73 65 72 76 65 64 20 62 69 74 73 20 69 73 20  eserved bits is 
167b0 74 68 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20  the same in the 
167c0 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70  destination.** p
167d0 61 67 65 72 20 61 73 20 69 74 20 69 73 20 69 6e  ager as it is in
167e0 20 74 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68   the source.  Th
167f0 69 73 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e  is comes up when
16800 20 61 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65   a VACUUM change
16810 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
16820 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
16830 20 74 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c   to the "optimal
16840 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  " amount..*/.voi
16850 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c  d sqlite3PagerAl
16860 69 67 6e 52 65 73 65 72 76 65 28 50 61 67 65 72  ignReserve(Pager
16870 20 2a 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a   *pDest, Pager *
16880 70 53 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65  pSrc){.  if( pDe
16890 73 74 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53  st->nReserve!=pS
168a0 72 63 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a  rc->nReserve ){.
168b0 20 20 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65      pDest->nRese
168c0 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73  rve = pSrc->nRes
168d0 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
168e0 65 70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29  eportSize(pDest)
168f0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
16900 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
16910 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
16920 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
16930 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
16940 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
16950 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
16960 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
16970 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
16980 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
16990 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
169a0 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
169b0 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
169c0 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
169d0 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
169e0 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
169f0 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
16a00 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
16a10 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
16a20 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
16a30 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
16a40 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
16a50 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
16a60 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
16a70 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
16a80 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
16a90 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
16aa0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16ab0 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
16ac0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
16ad0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
16ae0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
16af0 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
16b00 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
16b10 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16b20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
16b30 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
16b40 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
16b50 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
16b60 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
16b70 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
16b80 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
16b90 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
16ba0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16bb0 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
16bc0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
16bd0 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
16be0 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
16bf0 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
16c00 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
16c10 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
16c20 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
16c30 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
16c40 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
16c50 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
16c60 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
16c70 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
16c80 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
16c90 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
16ca0 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
16cb0 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
16cc0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16cd0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
16ce0 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
16cf0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
16d00 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
16d10 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
16d20 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
16d30 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
16d40 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16d50 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
16d60 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
16d70 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
16d80 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
16d90 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16da0 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
16db0 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
16dc0 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
16dd0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
16de0 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
16df0 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
16e00 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
16e10 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
16e20 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16e30 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
16e40 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
16e50 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
16e60 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
16e70 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
16e80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
16e90 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
16ea0 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
16eb0 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
16ec0 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
16ed0 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
16ee0 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
16ef0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
16f00 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
16f10 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
16f20 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
16f30 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
16f40 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
16f50 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
16f60 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
16f70 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
16f80 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
16f90 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
16fa0 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
16fb0 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
16fc0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
16fd0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
16fe0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
16ff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17000 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
17010 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
17020 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
17030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
17040 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
17050 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
17060 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
17070 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
17080 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
17090 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
170a0 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
170b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
170c0 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
170d0 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
170e0 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
170f0 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
17100 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
17110 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
17120 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
17130 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17150 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
17160 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
17170 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
17180 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171a0 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
171b0 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
171c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
171d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
171e0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
171f0 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
17200 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
17210 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
17240 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
17250 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
17260 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
17270 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
17280 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
17290 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
172a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
172b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
172c0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
172d0 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
172e0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
172f0 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
17300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17310 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
17320 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
17330 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
17340 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68  AS_CODEC.  /* Th
17350 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69  e jrnlEnc flag i
17360 73 20 74 72 75 65 20 69 66 20 4a 6f 75 72 6e 61  s true if Journa
17370 6c 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  l pages should b
17380 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  e passed through
17390 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e  .  ** the codec.
173a0 20 20 49 74 20 69 73 20 66 61 6c 73 65 20 66 6f    It is false fo
173b0 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79  r pure in-memory
173c0 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
173d0 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e  const int jrnlEn
173e0 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20  c = (isMainJrnl 
173f0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
17400 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e  nMemory==0);.#en
17410 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 28  dif..  assert( (
17420 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
17430 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
17440 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
17450 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
17460 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
17470 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
17480 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
17490 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
174a0 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
174b0 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
174c0 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
174d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
174e0 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
174f0 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
17500 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
17510 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
17520 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
17530 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
17540 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
17550 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
17560 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
17570 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
17580 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
17590 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
175a0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
175b0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
175c0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
175d0 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
175e0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
175f0 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
17600 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
17610 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
17620 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
17630 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
17640 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
17650 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
17660 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
17670 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
17680 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
17690 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
176a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
176b0 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
176c0 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
176d0 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
176e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
176f0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
17700 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
17710 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
17720 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
17730 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
17740 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
17750 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17760 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17770 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
17780 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
17790 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
177a0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
177b0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
177c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
177d0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
177e0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
177f0 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
17800 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
17810 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
17820 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
17830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
17840 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
17850 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
17860 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
17870 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
17880 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
17890 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
178a0 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
178b0 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
178c0 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
178d0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
178e0 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
178f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17900 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17920 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
17930 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17940 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
17950 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
17960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17970 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
17980 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
17990 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
179a0 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
179b0 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
179c0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
179d0 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
179e0 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
179f0 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
17a00 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
17a10 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
17a20 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
17a30 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
17a40 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
17a50 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
17a60 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
17a70 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
17a80 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
17a90 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
17aa0 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
17ab0 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
17ac0 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
17ad0 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
17ae0 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
17af0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
17b00 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
17b10 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
17b20 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
17b30 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
17b40 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
17b50 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
17b60 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
17b70 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
17b80 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
17b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17ba0 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
17bb0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
17bc0 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
17bd0 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
17be0 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
17bf0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
17c00 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
17c10 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
17c20 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
17c30 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
17c40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17c50 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
17c60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
17c70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
17c80 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
17c90 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
17ca0 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
17cb0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
17cc0 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
17cd0 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
17ce0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
17cf0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
17d00 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
17d10 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
17d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17d30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
17d40 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
17d50 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
17d60 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
17d70 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
17d80 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
17d90 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17da0 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
17db0 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
17dc0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
17dd0 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
17de0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
17df0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
17e00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
17e10 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
17e20 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
17e30 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
17e40 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
17e50 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
17e60 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
17e70 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
17e80 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
17e90 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
17ea0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
17eb0 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
17ec0 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
17ed0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
17ee0 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
17ef0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
17f00 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
17f10 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
17f20 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
17f30 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
17f40 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
17f50 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
17f60 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
17f70 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
17f80 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
17f90 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
17fa0 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
17fb0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
17fc0 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
17fd0 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
17fe0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
17ff0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
18000 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
18010 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
18020 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
18030 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
18040 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
18050 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
18060 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
18070 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
18080 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
18090 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
180a0 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
180b0 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
180c0 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
180d0 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
180e0 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
180f0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
18100 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
18110 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
18120 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
18130 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
18140 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
18150 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
18160 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
18170 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
18180 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
18190 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
181a0 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
181b0 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
181c0 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
181d0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
181e0 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
181f0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
18200 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
18210 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
18220 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
18230 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
18240 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
18250 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
18260 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
18270 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
18280 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
18290 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
182a0 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
182b0 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
182c0 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
182d0 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
182e0 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
182f0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
18300 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
18310 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
18320 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
18330 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
18340 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
18350 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
18360 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
18370 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
18380 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
18390 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
183a0 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
183b0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
183c0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
183d0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
183e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
183f0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
18400 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
18410 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
18420 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
18430 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
18440 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
18450 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
18460 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
18470 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
18480 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
18490 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
184a0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
184b0 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
184c0 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
184d0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
184e0 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
184f0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
18500 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
18510 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
18520 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
18530 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
18540 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
18550 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
18560 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
18570 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
18580 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
18590 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
185a0 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
185b0 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
185c0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
185d0 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
185e0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
185f0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
18600 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
18610 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
18620 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
18630 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
18640 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
18650 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
18660 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
18670 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
18680 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
18690 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
186a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
186b0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
186c0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
186d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
186e0 46 69 6c 65 20 29 3b 0a 20 20 50 41 47 45 52 54  File );.  PAGERT
186f0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
18700 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
18710 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
18720 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
18730 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
18740 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
18750 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18760 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
18770 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
18780 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
18790 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
187a0 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
187b0 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
187c0 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
187d0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
187e0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
187f0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
18800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
18810 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
18820 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
18830 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
18840 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
18850 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18860 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
18870 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
18880 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
18890 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
188a0 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
188b0 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
188c0 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
188d0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
188e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
188f0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
18900 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
18910 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
18920 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
18930 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
18940 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
18950 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
18960 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 61   /* Write the da
18970 74 61 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ta read from the
18980 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e   journal back in
18990 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
189a0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69  file..    ** Thi
189b0 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66  s is usually saf
189c0 65 20 65 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e  e even for an en
189d0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
189e0 20 2d 20 61 73 20 74 68 65 20 64 61 74 61 0a 20   - as the data. 
189f0 20 20 20 2a 2a 20 77 61 73 20 65 6e 63 72 79 70     ** was encryp
18a00 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 77 61  ted before it wa
18a10 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
18a20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18a30 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  he exception.   
18a40 20 2a 2a 20 69 73 20 69 66 20 74 68 65 20 64 61   ** is if the da
18a50 74 61 20 77 61 73 20 6a 75 73 74 20 72 65 61 64  ta was just read
18a60 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f   from an in-memo
18a70 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ry sub-journal. 
18a80 49 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  In that.    ** c
18a90 61 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 65  ase it must be e
18aa0 6e 63 72 79 70 74 65 64 20 68 65 72 65 20 62 65  ncrypted here be
18ab0 66 6f 72 65 20 69 74 20 69 73 20 63 6f 70 69 65  fore it is copie
18ac0 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  d into the datab
18ad0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ase.    ** file.
18ae0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
18af0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
18b00 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b   if( !jrnlEnc ){
18b10 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
18b20 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
18b30 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
18b40 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74  NOMEM_BKPT, aDat
18b50 61 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  a);.      rc = s
18b60 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
18b70 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29  ager->fd, (u8 *)
18b80 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
18b90 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
18ba0 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18bb0 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18bc0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
18bd0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
18be0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
18bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
18c00 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
18c10 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
18c20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18c30 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  ofst);..    if( 
18c40 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
18c50 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
18c60 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
18c70 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
18c80 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
18c90 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 23 69 66  ->pBackup ){.#if
18ca0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
18cb0 4f 44 45 43 0a 20 20 20 20 20 20 69 66 28 20 6a  ODEC.      if( j
18cc0 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20 20  rnlEnc ){.      
18cd0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
18ce0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
18cf0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
18d00 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 20 20  _BKPT);.        
18d10 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
18d20 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
18d30 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
18d40 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
18d50 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
18d60 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
18d70 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
18d80 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20 20 20 20  KPT,aData);.    
18d90 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
18da0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
18db0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
18dc0 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
18dd0 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
18de0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
18df0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
18e00 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
18e10 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
18e20 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
18e30 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
18e40 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
18e50 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
18e60 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
18e70 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
18e80 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
18e90 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
18ea0 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
18eb0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
18ec0 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
18ed0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
18ee0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
18ef0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
18f00 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
18f10 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
18f20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
18f30 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
18f40 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
18f50 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
18f60 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
18f70 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
18f80 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
18f90 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
18fa0 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
18fb0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
18fc0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
18fd0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
18fe0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
18ff0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
19000 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
19010 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
19020 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
19030 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
19040 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
19050 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
19060 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
19070 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
19080 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
19090 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
190a0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
190b0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
190c0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
190d0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
190e0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
190f0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
19100 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
19110 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
19120 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
19130 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
19140 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
19150 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
19160 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
19170 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
19180 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
19190 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
191a0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
191b0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
191c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
191d0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
191e0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
191f0 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
19200 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
19210 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
19220 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
19230 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
19240 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
19250 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
19260 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
19270 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
19280 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
19290 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
192a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
192b0 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
192c0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
192d0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
192e0 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
192f0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
19300 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
19310 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
19320 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
19330 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
19340 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
19350 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
19360 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
19370 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
19380 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
19390 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
193a0 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
193b0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
193c0 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
193d0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
193e0 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
193f0 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
19400 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
19410 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19420 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
19430 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
19440 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
19450 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
19460 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
19470 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19480 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
19490 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
194a0 20 20 20 20 2f 2a 20 49 74 20 75 73 65 64 20 74      /* It used t
194b0 6f 20 62 65 20 74 68 61 74 20 73 71 6c 69 74 65  o be that sqlite
194c0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
194d0 28 70 50 67 29 20 77 61 73 20 63 61 6c 6c 65 64  (pPg) was called
194e0 20 68 65 72 65 2e 20 20 42 75 74 0a 20 20 20 20   here.  But.    
194f0 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20 77 61 73  ** that call was
19500 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 68   dangerous and h
19510 61 64 20 6e 6f 20 64 65 74 65 63 74 61 62 6c 65  ad no detectable
19520 20 62 65 6e 65 66 69 74 20 73 69 6e 63 65 20 74   benefit since t
19530 68 65 20 63 61 63 68 65 0a 20 20 20 20 2a 2a 20  he cache.    ** 
19540 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61  is normally clea
19550 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
19560 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61  acheCleanAll() a
19570 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  fter rollback an
19580 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20  d so.    ** has 
19590 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  been removed. */
195a0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
195b0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20  agehash(pPg);.. 
195c0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
195d0 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
195e0 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
195f0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
19600 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
19610 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
19620 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
19630 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
19640 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
19650 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
19660 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
19670 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
19680 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
19690 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
196a0 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
196b0 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
196c0 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  sk */.#if SQLITE
196d0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69  _HAS_CODEC.    i
196e0 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f  f( jrnlEnc ){ CO
196f0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
19700 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
19710 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
19720 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69  M_BKPT); }.#endi
19730 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  f.    sqlite3Pca
19740 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
19750 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
19770 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
19780 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
19790 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
197a0 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
197b0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
197c0 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
197d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
197e0 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
197f0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
19800 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19810 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
19820 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
19830 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
19840 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
19850 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
19860 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
19870 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
19880 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
19890 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
198a0 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
198b0 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
198c0 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
198d0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
198e0 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
198f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19900 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
19910 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
19920 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
19930 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
19940 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
19950 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
19960 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
19970 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
19980 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
19990 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
199a0 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
199b0 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
199c0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
199d0 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
199e0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
199f0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
19a00 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
19a10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
19a20 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
19a30 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
19a40 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
19a50 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
19a60 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
19a70 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
19a80 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
19a90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
19aa0 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
19ab0 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
19ac0 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
19ad0 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
19ae0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
19af0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
19b00 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
19b10 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
19b20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
19b30 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
19b40 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
19b50 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
19b60 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
19b70 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
19b80 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
19b90 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
19ba0 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
19bb0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
19bc0 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
19bd0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
19be0 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
19bf0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
19c00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
19c10 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
19c20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
19c30 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
19c40 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
19c50 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
19c60 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
19c70 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
19c80 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
19c90 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
19ca0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
19cb0 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
19cc0 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
19cd0 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
19ce0 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
19cf0 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
19d00 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
19d10 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
19d20 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
19d30 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
19d40 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
19d50 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
19d60 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
19d70 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
19d80 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
19d90 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
19da0 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
19db0 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
19dc0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
19dd0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19de0 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
19df0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
19e00 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
19e10 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
19e20 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
19e30 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19e40 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
19e50 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
19e60 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
19e70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
19e80 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19e90 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
19ea0 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
19eb0 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
19ec0 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
19ed0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
19ee0 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
19ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19f00 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
19f10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
19f20 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
19f30 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
19f40 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
19f50 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
19f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19f70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
19f80 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
19f90 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
19fa0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
19fb0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
19fc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
19fd0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
19fe0 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
19ff0 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
1a000 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
1a010 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
1a020 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
1a030 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
1a040 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1a050 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
1a060 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
1a070 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a080 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1a090 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
1a0a0 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
1a0b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1a0c0 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
1a0d0 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
1a0e0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
1a0f0 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
1a100 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
1a110 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
1a120 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
1a130 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
1a140 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
1a150 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
1a160 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
1a170 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
1a180 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1a190 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
1a1a0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
1a1b0 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
1a1c0 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
1a1d0 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
1a1e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a1f0 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
1a200 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
1a210 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
1a220 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
1a230 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
1a240 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
1a250 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
1a260 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
1a270 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
1a280 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
1a290 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
1a2a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a2b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  OMEM_BKPT;.  }el
1a2c0 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
1a2d0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
1a2e0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
1a2f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1a300 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
1a310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1a320 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
1a330 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
1a340 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
1a350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a360 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1a370 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
1a380 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
1a390 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1a3a0 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
1a3b0 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
1a3c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
1a3d0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
1a3e0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
1a3f0 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
1a400 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
1a410 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
1a420 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
1a430 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
1a440 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1a450 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
1a460 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
1a470 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
1a480 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1a490 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
1a4a0 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
1a4b0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
1a4c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a4d0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a4e0 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
1a4f0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1a500 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
1a510 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
1a520 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
1a530 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
1a540 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
1a550 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
1a560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a570 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67  OMEM_BKPT;.    g
1a580 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a590 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  t;.  }.  zMaster
1a5a0 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
1a5b0 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
1a5c0 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20  rnal+1];.  rc = 
1a5d0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
1a5e0 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
1a5f0 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
1a600 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
1a610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a620 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a630 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73  ster_out;.  zMas
1a640 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
1a650 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
1a660 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d  .  zJournal = zM
1a670 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
1a680 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
1a690 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
1a6a0 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
1a6b0 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  ){.    int exist
1a6c0 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
1a6d0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a6e0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
1a6f0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1a700 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
1a710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a720 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1a730 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a740 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69     }.    if( exi
1a750 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sts ){.      /* 
1a760 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
1a770 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
1a780 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
1a790 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
1a7a0 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
1a7b0 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
1a7c0 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
1a7d0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
1a7e0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
1a7f0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
1a800 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
1a810 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
1a820 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1a830 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  c;.      int fla
1a840 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
1a850 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
1a860 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1a870 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  NAL);.      rc =
1a880 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1a890 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
1a8a0 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
1a8b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1a8c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a8d0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a8e0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a8f0 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72   }..      rc = r
1a900 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1a910 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
1a920 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
1a930 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
1a940 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
1a950 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
1a960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a970 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a980 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a990 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d   }..      c = zM
1a9a0 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
1a9b0 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
1a9c0 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
1a9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b  ;.      if( c ){
1a9e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  .        /* We h
1a9f0 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
1aa00 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
1aa10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1aa20 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  le. */.        g
1aa30 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1aa40 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1aa50 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d  .    zJournal +=
1aa60 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
1aa70 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
1aa80 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f    }. .  sqlite3O
1aa90 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
1aaa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1aab0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
1aac0 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
1aad0 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  aster_out:.  sql
1aae0 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
1aaf0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
1ab00 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
1ab10 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1ab20 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
1ab30 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
1ab40 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71  urnal) );.    sq
1ab50 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
1ab60 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1ab70 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1ab80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ab90 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
1aba0 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
1abb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1abc0 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
1abd0 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
1abe0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
1abf0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
1ac00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
1ac10 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
1ac20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
1ac30 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
1ac40 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
1ac50 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
1ac60 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1ac70 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
1ac80 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72  en, or the pager
1ac90 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65   is not in eithe
1aca0 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50  r.** DBMOD or OP
1acb0 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  EN state, this f
1acc0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1acd0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1ace0 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74  he size .** of t
1acf0 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67  he file is chang
1ad00 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
1ad10 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
1ad20 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
1ad30 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  . .** If the fil
1ad40 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  e on disk is cur
1ad50 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
1ad60 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
1ad70 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
1ad80 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
1ad90 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
1ada0 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
1adb0 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
1adc0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
1add0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
1ade0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
1adf0 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
1ae00 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1ae10 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
1ae20 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
1ae30 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
1ae40 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
1ae50 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
1ae60 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
1ae70 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
1ae80 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
1ae90 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
1aea0 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
1aeb0 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
1aec0 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
1aed0 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
1aee0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
1aef0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
1af00 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1af10 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1af20 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
1af30 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
1af40 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
1af50 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
1af60 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1af70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1af80 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
1af90 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
1afa0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1afb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1afc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1afd0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
1afe0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
1aff0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
1b000 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
1b010 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
1b020 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
1b030 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1b040 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1b050 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1b060 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1b070 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
1b080 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
1b090 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
1b0a0 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
1b0b0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1b0c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b0d0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
1b0e0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
1b0f0 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
1b100 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
1b110 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
1b120 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1b130 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1b140 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
1b150 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
1b160 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
1b170 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
1b180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b190 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
1b1a0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1b1b0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
1b1c0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1b1d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b1e0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
1b1f0 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
1b200 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b210 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50  (currentSize+szP
1b220 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b  age)<=newSize ){
1b230 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1b240 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
1b250 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
1b260 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
1b270 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
1b280 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
1b290 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
1b2a0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
1b2b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1b2c0 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1b2d0 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
1b2e0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1b2f0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1b300 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
1b310 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
1b320 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
1b330 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1b340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b350 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1b360 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
1b370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b3a0 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72   a sanitized ver
1b3b0 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74  sion of the sect
1b3c0 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69  or-size of OS fi
1b3d0 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a  le pFile. The.**
1b3e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1b3f0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
1b400 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e  ie between 32 an
1b410 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  d MAX_SECTOR_SIZ
1b420 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
1b430 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  3SectorSize(sqli
1b440 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
1b450 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73  {.  int iRet = s
1b460 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
1b470 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ze(pFile);.  if(
1b480 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20   iRet<32 ){.    
1b490 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65  iRet = 512;.  }e
1b4a0 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58  lse if( iRet>MAX
1b4b0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
1b4c0 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
1b4d0 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
1b4e0 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d   );.    iRet = M
1b4f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
1b500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1b510 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
1b520 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1b530 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1b540 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
1b550 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
1b560 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
1b570 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b580 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1b590 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
1b5a0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1b5b0 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
1b5c0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
1b5d0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
1b5e0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
1b5f0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
1b600 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
1b610 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
1b620 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
1b630 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
1b640 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
1b650 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
1b660 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
1b670 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1b680 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
1b690 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
1b6a0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
1b6b0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
1b6c0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1b6d0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
1b6e0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1b6f0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1b700 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
1b710 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
1b720 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
1b730 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
1b740 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
1b750 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
1b760 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
1b770 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
1b780 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  IZE..**.** If th
1b790 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53  e file has the S
1b7a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1b7b0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1b7c0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73  property, then s
1b7d0 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  et.** the effect
1b7e0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1b7f0 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76  to its minimum v
1b800 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65  alue (512).  The
1b810 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70   purpose of.** p
1b820 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1b830 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74  e is to define t
1b840 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73  he "blast radius
1b850 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a  " of bytes that.
1b860 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1b870 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  if a crash occur
1b880 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  s while writing 
1b890 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  to a single byte
1b8a0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67   in.** that rang
1b8b0 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57  e.  But with POW
1b8c0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1b8d0 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69  , the blast radi
1b8e0 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74  us is zero.** (t
1b8f0 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45  hat is what POWE
1b900 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1b910 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69  means), so we mi
1b920 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f  nimize the secto
1b930 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20  r.** size.  For 
1b940 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
1b950 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72  ibility of the r
1b960 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1b970 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20  file format,.** 
1b980 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65  we cannot reduce
1b990 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b9a0 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77  ector size below
1b9b0 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
1b9c0 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
1b9d0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1b9e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
1b9f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1ba00 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1ba10 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ile );..  if( pP
1ba20 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1ba30 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
1ba40 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ba50 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1ba60 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   & .            
1ba70 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50    SQLITE_IOCAP_P
1ba80 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ba90 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  TE)!=0.  ){.    
1baa0 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
1bab0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
1bac0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1bad0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
1bae0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
1baf0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1bb00 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
1bb10 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
1bb20 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
1bb30 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
1bb40 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  t. */.    pPager
1bb50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
1bb60 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  12;.  }else{.   
1bb70 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1bb80 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63  ize = sqlite3Sec
1bb90 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
1bba0 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fd);.  }.}../*.*
1bbb0 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
1bbc0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
1bbd0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1bbe0 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
1bbf0 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1bc00 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
1bc10 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
1bc20 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
1bc30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1bc40 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
1bc50 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
1bc60 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
1bc70 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
1bc80 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
1bc90 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
1bca0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1bcb0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1bcc0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
1bcd0 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
1bce0 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
1bcf0 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
1bd00 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
1bd10 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
1bd20 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
1bd30 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
1bd40 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
1bd50 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
1bd60 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1bd70 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1bd80 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
1bd90 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
1bda0 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
1bdb0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
1bdc0 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
1bdd0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1bde0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1bdf0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
1be00 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
1be10 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
1be20 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
1be30 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1be40 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1be50 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
1be60 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
1be70 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
1be80 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
1be90 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
1bea0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1beb0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1bec0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
1bed0 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
1bee0 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
1bef0 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
1bf00 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
1bf10 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
1bf20 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
1bf30 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
1bf40 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
1bf50 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
1bf60 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
1bf70 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
1bf80 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
1bf90 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
1bfa0 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
1bfb0 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
1bfc0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
1bfd0 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
1bfe0 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
1bff0 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
1c000 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
1c010 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1c020 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
1c030 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
1c040 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
1c050 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
1c060 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
1c070 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
1c080 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
1c090 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1c0a0 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
1c0b0 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
1c0c0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1c0d0 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
1c0e0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1c0f0 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
1c100 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
1c110 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
1c120 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
1c130 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
1c140 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
1c150 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
1c160 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1c170 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
1c180 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1c190 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
1c1a0 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
1c1b0 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
1c1c0 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
1c1d0 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
1c1e0 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
1c1f0 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
1c200 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
1c210 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
1c220 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
1c230 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
1c240 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
1c250 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
1c260 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1c270 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
1c280 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
1c290 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
1c2a0 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
1c2b0 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
1c2c0 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
1c2d0 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
1c2e0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
1c2f0 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
1c300 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
1c310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1c320 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1c330 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
1c340 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
1c350 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
1c360 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
1c370 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
1c380 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
1c390 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1c3a0 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
1c3b0 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
1c3c0 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
1c3d0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
1c3e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c3f0 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
1c400 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
1c410 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
1c420 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
1c430 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
1c440 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
1c450 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
1c460 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
1c470 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
1c480 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
1c490 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
1c4a0 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
1c4b0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1c4c0 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
1c4d0 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
1c4e0 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
1c4f0 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
1c500 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
1c510 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
1c520 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
1c530 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
1c540 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
1c550 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1c560 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
1c570 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
1c580 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
1c590 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
1c5a0 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
1c5b0 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
1c5c0 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
1c5d0 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
1c5e0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
1c5f0 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
1c600 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
1c610 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
1c620 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
1c630 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
1c640 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
1c650 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
1c660 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
1c670 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
1c680 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
1c690 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
1c6a0 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
1c6b0 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
1c6c0 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
1c6d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c6e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1c6f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1c700 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
1c710 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1c720 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1c730 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
1c740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c750 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1c760 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1c770 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c790 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
1c7a0 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1c7b0 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c7d0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1c7e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
1c7f0 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
1c800 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c810 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
1c820 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
1c830 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1c840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1c850 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
1c860 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1c870 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
1c880 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1c890 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1c8a0 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
1c8b0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
1c8c0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1c8d0 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
1c8e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
1c8f0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
1c900 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
1c910 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
1c920 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
1c930 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
1c940 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61  ck */.  int nPla
1c950 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  yback = 0;      
1c960 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1c970 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72   of pages restor
1c980 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ed from journal 
1c990 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 50 61  */.  u32 savedPa
1c9a0 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
1c9b0 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  >pageSize;..  /*
1c9c0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1c9d0 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
1c9e0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1c9f0 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
1ca00 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
1ca10 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
1ca20 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1ca30 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1ca40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ca50 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1ca60 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
1ca70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ca80 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
1ca90 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1caa0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1cab0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
1cac0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
1cad0 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
1cae0 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
1caf0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1cb00 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
1cb10 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
1cb20 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
1cb30 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
1cb40 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
1cb50 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
1cb60 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
1cb70 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
1cb80 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
1cb90 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
1cba0 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
1cbb0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
1cbc0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
1cbd0 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
1cbe0 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
1cbf0 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
1cc00 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
1cc10 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
1cc20 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
1cc30 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
1cc40 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1cc50 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
1cc60 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50  unix.c,.  ** mxP
1cc70 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
1cc80 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
1cc90 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
1cca0 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
1ccb0 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
1ccc0 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
1ccd0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1cce0 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
1ccf0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1cd00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1cd10 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1cd20 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1cd30 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
1cd40 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1cd50 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
1cd60 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1cd70 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
1cd80 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1cd90 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
1cda0 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
1cdb0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1cdc0 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
1cdd0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1cde0 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
1cdf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1ce00 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
1ce10 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
1ce20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
1ce30 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
1ce40 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
1ce50 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
1ce60 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
1ce70 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
1ce80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1ce90 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
1cea0 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
1ceb0 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
1cec0 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61   1 ){.    /* Rea
1ced0 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
1cee0 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
1cef0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1cf00 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
1cf10 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
1cf20 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
1cf30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1cf40 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
1cf50 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
1cf60 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
1cf70 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
1cf80 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1cf90 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
1cfa0 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
1cfb0 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
1cfc0 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
1cfd0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
1cfe0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1cff0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
1d000 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a  Pager, isHot, sz
1d010 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
1d020 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1d030 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
1d040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d050 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1d060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1d080 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1d090 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d0a0 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
1d0b0 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
1d0c0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
1d0d0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1d0e0 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
1d0f0 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1d100 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1d110 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
1d120 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
1d130 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
1d140 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
1d150 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
1d160 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
1d170 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
1d180 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
1d190 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
1d1a0 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
1d1b0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
1d1c0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
1d1d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d1e0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1d1f0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1d200 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
1d210 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1d220 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1d230 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
1d240 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1d250 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d260 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
1d270 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
1d280 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1d290 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1d2a0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1d2b0 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
1d2c0 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
1d2d0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
1d2e0 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
1d2f0 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
1d300 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
1d310 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
1d320 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
1d330 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
1d340 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
1d350 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
1d360 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
1d370 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
1d380 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
1d390 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
1d3a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
1d3b0 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
1d3c0 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
1d3d0 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
1d3e0 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e  565..    ** When
1d3f0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1d400 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65  hot journal, nRe
1d410 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e  c==0 always mean
1d420 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a  s that the next.
1d430 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20      ** chunk of 
1d440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
1d450 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20  ains zero pages 
1d460 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1d470 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77  k.  But.    ** w
1d480 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c  hen doing a ROLL
1d490 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65  BACK and the nRe
1d4a0 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68  c==0 chunk is th
1d4b0 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a  e last chunk in.
1d4c0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
1d4d0 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  al, it means tha
1d4e0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  t the journal mi
1d4f0 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69  ght contain addi
1d500 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61  tional.    ** pa
1d510 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
1d520 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1d530 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d  and that the num
1d540 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20  ber of pages .  
1d550 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63    ** should be c
1d560 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e  omputed based on
1d570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d580 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
1d590 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
1d5a0 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
1d5b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1d5c0 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1d5d0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1d5e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d5f0 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
1d600 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70  = (int)((szJ - p
1d610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d620 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
1d630 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1d640 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d650 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1d660 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
1d670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
1d680 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
1d690 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1d6a0 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
1d6b0 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
1d6c0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
1d6d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1d6e0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1d6f0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
1d700 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
1d710 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
1d720 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d740 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1d750 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
1d760 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1d770 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
1d780 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
1d790 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
1d7a0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1d7b0 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
1d7c0 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
1d7d0 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20  ase file and/or 
1d7e0 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20  page cache..    
1d7f0 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
1d800 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
1d810 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65      if( needPage
1d820 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
1d830 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1d840 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  ager);.        n
1d850 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1d860 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1d870 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1d880 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
1d890 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  ager,&pPager->jo
1d8a0 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b  urnalOff,0,1,0);
1d8b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d8c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d8d0 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b      nPlayback++;
1d8e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d8f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d900 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1d910 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1d920 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1d930 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1d940 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1d950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1d960 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1d970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1d980 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1d990 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1d9a0 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1d9b0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1d9c0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1d9d0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1d9e0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1d9f0 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1da00 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1da10 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1da20 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1da30 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1da40 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1da50 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1da60 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1da70 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1da80 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1da90 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1daa0 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1dab0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1dac0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1dad0 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1dae0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1daf0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1db00 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1db10 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1db20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1db30 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1db40 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1db50 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1db60 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1db70 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1db80 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1db90 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1dba0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1dbb0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1dbc0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1dbd0 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1dbe0 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1dbf0 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1dc00 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1dc10 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1dc20 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1dc30 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1dc40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1dc50 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1dc60 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1dc70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1dc80 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1dc90 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1dca0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1dcb0 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  k:.  if( rc==SQL
1dcc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1dcd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1dce0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
1dcf0 72 2c 20 26 73 61 76 65 64 50 61 67 65 53 69 7a  r, &savedPageSiz
1dd00 65 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a  e, -1);.  }.  /*
1dd10 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
1dd20 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
1dd30 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
1dd40 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
1dd50 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
1dd60 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
1dd70 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
1dd80 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
1dd90 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
1dda0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1ddb0 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
1ddc0 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
1ddd0 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
1dde0 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
1ddf0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1de00 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
1de10 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ed..  */.#ifdef 
1de20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1de30 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  f( pPager->fd->p
1de40 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73  Methods ){.    s
1de50 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1de60 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
1de70 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  fd,SQLITE_FCNTL_
1de80 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b  DB_UNCHANGED,0);
1de90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1dea0 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
1deb0 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
1dec0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
1ded0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
1dee0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
1def0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
1df00 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
1df10 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1df20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
1df30 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
1df40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1df50 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
1df60 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1df70 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
1df80 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
1df90 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
1dfa0 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
1dfb0 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
1dfc0 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
1dfd0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
1dfe0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
1dff0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
1e000 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
1e010 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
1e020 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1e030 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
1e040 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
1e050 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
1e060 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
1e070 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
1e080 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1e090 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
1e0a0 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
1e0b0 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
1e0c0 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
1e0d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1e0e0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
1e0f0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1e100 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
1e110 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
1e120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e130 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
1e140 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1e150 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
1e160 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1e170 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1e180 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1e190 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1e1a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1e1b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1e1c0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1e1d0 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70  LITE_OK.   && (p
1e1e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1e1f0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1e200 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1e210 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1e220 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
1e230 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
1e240 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
1e250 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e260 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1e270 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1e280 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
1e290 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20  aster[0]!='\0', 
1e2a0 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  0);.    testcase
1e2b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e2c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1e2d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1e2e0 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
1e2f0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1e300 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
1e310 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
1e320 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1e330 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
1e340 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
1e350 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
1e360 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
1e370 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
1e380 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
1e390 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
1e3a0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
1e3b0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1e3c0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1e3d0 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c  if( isHot && nPl
1e3e0 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71  ayback ){.    sq
1e3f0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
1e400 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
1e410 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76  ROLLBACK, "recov
1e420 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66 72  ered %d pages fr
1e430 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  om %s",.        
1e440 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63          nPlaybac
1e450 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  k, pPager->zJour
1e460 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nal);.  }..  /* 
1e470 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
1e480 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
1e490 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
1e4a0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
1e4b0 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
1e4c0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
1e4d0 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
1e4e0 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
1e4f0 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
1e500 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
1e510 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
1e520 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
1e530 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
1e540 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
1e550 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e560 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
1e570 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
1e580 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1e590 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e5a0 28 6f 72 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68  (or out of.** th
1e5b0 65 20 57 41 4c 20 69 66 20 74 68 61 74 20 69 73  e WAL if that is
1e5c0 20 77 68 65 72 65 20 74 68 65 20 6d 6f 73 74 20   where the most 
1e5d0 72 65 63 65 6e 74 20 63 6f 70 79 20 69 66 20 66  recent copy if f
1e5e0 6f 75 6e 64 29 20 69 6e 74 6f 20 0a 2a 2a 20 70  ound) into .** p
1e5f0 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1e600 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1e610 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1e620 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e630 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1e640 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1e650 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1e660 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1e670 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1e680 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1e690 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1e6a0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1e6b0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1e6c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1e6d0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1e6e0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1e6f0 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1e700 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1e710 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1e720 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1e730 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1e740 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1e750 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
1e760 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e770 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1e780 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1e790 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1e7a0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 69 6e 74  age pPg */.  int
1e7b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e7d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
1e7e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e7f0 5f 57 41 4c 0a 20 20 75 33 32 20 69 46 72 61 6d  _WAL.  u32 iFram
1e800 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1e810 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 6f 66 20      /* Frame of 
1e820 57 41 4c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  WAL containing p
1e830 67 6e 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  gno */..  assert
1e840 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1e850 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
1e860 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
1e870 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1e880 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
1e890 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
1e8a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
1e8b0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
1e8c0 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1e8d0 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Wal, pPg->pgno, 
1e8e0 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66  &iFrame);.    if
1e8f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 46 72 61  ;.  }.  if( iFra
1e910 6d 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  me ){.    rc = s
1e920 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61  qlite3WalReadFra
1e930 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e940 20 69 46 72 61 6d 65 2c 70 50 61 67 65 72 2d 3e   iFrame,pPager->
1e950 70 61 67 65 53 69 7a 65 2c 70 50 67 2d 3e 70 44  pageSize,pPg->pD
1e960 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  ata);.  }else.#e
1e970 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34  ndif.  {.    i64
1e980 20 69 4f 66 66 73 65 74 20 3d 20 28 70 50 67 2d   iOffset = (pPg-
1e990 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
1e9a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1e9b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e9c0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1e9d0 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1e9e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1e9f0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1ea00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1ea10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1ea20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ea30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1ea40 7d 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  }..  if( pPg->pg
1ea50 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  no==1 ){.    if(
1ea60 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
1ea70 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75  If the read is u
1ea80 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74  nsuccessful, set
1ea90 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b   the dbFileVers[
1eaa0 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20  ] to something. 
1eab0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c       ** that wil
1eac0 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c  l never be a val
1ead0 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e  id file version.
1eae0 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69    dbFileVers[] i
1eaf0 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a  s a copy.      *
1eb00 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33  * of bytes 24..3
1eb10 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1eb20 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31  e.  Bytes 28..31
1eb30 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1eb40 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  e.      ** zero 
1eb50 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
1eb60 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1eb70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33  age. Bytes 32..3
1eb80 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20  5 and 35..39.   
1eb90 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1eba0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69  page numbers whi
1ebb0 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66  ch are never 0xf
1ebc0 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c  fffffff.  So fil
1ebd0 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50  ling.      ** pP
1ebe0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ebf0 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66  [] with all 0xff
1ec00 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75   bytes should su
1ec10 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  ffice..      **.
1ec20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20        ** For an 
1ec30 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1ec40 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f  se, the situatio
1ec50 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  n is more comple
1ec60 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20  x:  bytes.      
1ec70 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  ** 24..39 of the
1ec80 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68   database are wh
1ec90 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20  ite noise.  But 
1eca0 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
1ecb0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74  of.      ** whit
1ecc0 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67  e noise equaling
1ecd0 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1ece0 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1ecf0 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1ed00 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1ed10 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1ed20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1ed30 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ed40 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1ed50 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1ed60 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1ed70 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1ed80 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1ed90 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1eda0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1edb0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1edc0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1edd0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1ede0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1edf0 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1ee00 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1ee10 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
1ee20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ee30 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47  EM_BKPT);..  PAG
1ee40 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1ee50 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1ee60 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1ee70 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1ee80 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1ee90 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1eea0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1eeb0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
1eec0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1eed0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1eee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eef0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1ef00 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65   pPg->pgno, page
1ef10 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1ef20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1ef30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1ef40 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1ef50 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1ef60 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61   at offsets 24 a
1ef70 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20  nd 92 in.** the 
1ef80 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73  header and the s
1ef90 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  qlite version nu
1efa0 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
1efb0 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  6..**.** This is
1efc0 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1efd0 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61  l update.  See a
1efe0 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e  lso the pager_in
1eff0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1f000 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68  ().** routine wh
1f010 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73  ich only updates
1f020 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1f030 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74  ter if the updat
1f040 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  e is actually.**
1f050 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65   needed, as dete
1f060 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50  rmined by the pP
1f070 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1f080 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69  tDone state vari
1f090 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1f0a0 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65  void pager_write
1f0b0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1f0c0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33  gHdr *pPg){.  u3
1f0d0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1f0e0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1f0f0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1f100 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1f110 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1f120 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1f130 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
1f140 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
1f150 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  Pg->pPager->dbFi
1f160 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74  leVers)+1;.  put
1f170 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1f180 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  Pg->pData)+24, c
1f190 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1f1a0 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65  .  /* Also store
1f1b0 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
1f1c0 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79  ion number in by
1f1d0 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69  tes 96..99 and i
1f1e0 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e  n.  ** bytes 92.
1f1f0 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68  .95 store the ch
1f200 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72  ange counter for
1f210 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69   which the versi
1f220 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69  on number.  ** i
1f230 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75  s valid. */.  pu
1f240 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1f250 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20  pPg->pData)+92, 
1f260 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1f270 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1f280 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1f290 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
1f2a0 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a  ION_NUMBER);.}..
1f2b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f2c0 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
1f2d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1f2e0 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
1f2f0 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68  each page that h
1f300 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f310 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
1f320 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68   the log file wh
1f330 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  en a WAL transac
1f340 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1f350 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ack..** Paramete
1f360 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67  r iPg is the pag
1f370 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64  e number of said
1f380 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20   page. The pCtx 
1f390 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20  argument .** is 
1f3a0 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
1f3b0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1f3c0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1f3d0 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20   If page iPg is 
1f3e0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63  present in the c
1f3f0 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f  ache, and has no
1f400 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1f410 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69  erences,.** it i
1f420 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68  s discarded. Oth
1f430 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1f440 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
1f450 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
1f460 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20  references, the 
1f470 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1f480 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  reloaded from th
1f490 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
1f4a0 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  he.** attempt to
1f4b0 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20   reload content 
1f4c0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1f4d0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  e is required an
1f4e0 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74  d fails, .** ret
1f4f0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1f500 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
1f510 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
1f520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f530 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1f540 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f  void *pCtx, Pgno
1f550 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20   iPg){.  int rc 
1f560 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1f570 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1f580 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  Pager *)pCtx;.  
1f590 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
1f5a0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1f5b0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1f5c0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
1f5d0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
1f5e0 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67   iPg);.  if( pPg
1f5f0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1f600 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
1f610 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b  count(pPg)==1 ){
1f620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
1f630 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
1f640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f650 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1f660 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
1f670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f680 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1f690 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1f6a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f6b0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f6c0 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20  NotNull(pPg);.  
1f6d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
1f6e0 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
1f6f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1f700 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
1f710 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
1f720 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
1f730 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
1f740 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
1f750 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1f760 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
1f770 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
1f780 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
1f790 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
1f7a0 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
1f7b0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
1f7c0 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
1f7d0 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
1f7e0 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
1f7f0 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
1f800 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
1f810 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1f820 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
1f830 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
1f840 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
1f850 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
1f860 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
1f870 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
1f880 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
1f890 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
1f8a0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
1f8b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
1f8c0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
1f8d0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
1f8e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f8f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f900 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
1f910 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1f920 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
1f930 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1f940 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
1f950 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
1f960 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f990 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
1f9a0 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f9c0 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
1f9d0 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
1f9e0 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
1f9f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1fa00 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
1fa10 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
1fa20 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
1fa30 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
1fa40 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
1fa50 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
1fa60 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
1fa70 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
1fa80 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
1fa90 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
1faa0 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
1fab0 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
1fac0 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
1fad0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
1fae0 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
1faf0 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
1fb00 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1fb10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
1fb20 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
1fb30 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
1fb40 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
1fb50 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
1fb60 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
1fb70 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1fb80 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1fb90 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1fba0 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  e);..#ifndef SQL
1fbb0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
1fbc0 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  ENT.  /* If this
1fbd0 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e   is an CONCURREN
1fbe0 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  T transaction, t
1fbf0 68 65 6e 20 70 61 67 65 20 31 20 6d 75 73 74 20  hen page 1 must 
1fc00 62 65 20 72 65 72 65 61 64 20 66 72 6f 6d 20 0a  be reread from .
1fc10 20 20 2a 2a 20 74 68 65 20 64 62 20 66 69 6c 65    ** the db file
1fc20 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  , even if it is 
1fc30 6e 6f 74 20 64 69 72 74 79 2e 20 54 68 69 73 20  not dirty. This 
1fc40 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 62  is because the b
1fc50 2d 74 72 65 65 20 6c 61 79 65 72 20 0a 20 20 2a  -tree layer .  *
1fc60 2a 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61  * may have alrea
1fc70 64 79 20 7a 65 72 6f 65 64 20 74 68 65 20 6e 46  dy zeroed the nF
1fc80 72 65 65 20 61 6e 64 20 69 54 72 75 6e 6b 20 68  ree and iTrunk h
1fc90 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 20 2a  eader fields.  *
1fca0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1fcb0 54 45 5f 4f 4b 20 26 26 20 28 70 4c 69 73 74 3d  TE_OK && (pList=
1fcc0 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e  =0 || pList->pgn
1fcd0 6f 21 3d 31 29 20 26 26 20 70 50 61 67 65 72 2d  o!=1) && pPager-
1fce0 3e 70 41 6c 6c 52 65 61 64 20 29 7b 0a 20 20 20  >pAllRead ){.   
1fcf0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1fd00 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 2a 29 70  allback((void*)p
1fd10 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 23  Pager, 1);.  }.#
1fd20 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20  endif..  while( 
1fd30 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
1fd40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
1fd50 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
1fd60 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
1fd70 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
1fd80 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
1fd90 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
1fda0 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
1fdb0 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
1fdc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1fdd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fde0 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
1fdf0 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
1fe00 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
1fe10 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
1fe20 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1fe30 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1fe40 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
1fe50 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
1fe60 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
1fe70 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
1fe80 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
1fe90 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
1fea0 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
1feb0 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
1fec0 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66  *.** The list of
1fed0 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e   pages passed in
1fee0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1fef0 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64  is always sorted
1ff00 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
1ff10 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61  .** Hence, if pa
1ff20 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79  ge 1 appears any
1ff30 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73  where on the lis
1ff40 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68  t, it will be th
1ff50 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f  e first page..*/
1ff60 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67   .static int pag
1ff70 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50  erWalFrames(.  P
1ff80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ffa0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1ffb0 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
1ffc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ffd0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1ffe0 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a  rames to log */.
1fff0 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65    Pgno nTruncate
20000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20010 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
20020 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f  ze after this co
20030 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mmit */.  int is
20040 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
20050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20060 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63  e if this is a c
20070 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ommit */.){.  in
20080 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
200a0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
200b0 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20    int nList;    
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
200e0 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f  ages in pList */
200f0 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
20120 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a  g over pages */.
20130 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20140 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73  r->pWal );.  ass
20150 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69  ert( pList );.#i
20160 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20170 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
20180 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74  at the page list
20190 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   is in accending
201a0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28   order */.  for(
201b0 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d  p=pList; p && p-
201c0 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44  >pDirty; p=p->pD
201d0 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72  irty){.    asser
201e0 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e  t( p->pgno < p->
201f0 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a  pDirty->pgno );.
20200 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
20210 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69  sert( pList->pDi
20220 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d  rty==0 || isComm
20230 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f  it );.  if( isCo
20240 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  mmit ){.    /* I
20250 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  f a WAL transact
20260 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ion is being com
20270 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73  mitted, there is
20280 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69   no point in wri
20290 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20  ting.    ** any 
202a0 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20  pages with page 
202b0 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20  numbers greater 
202c0 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69  than nTruncate i
202d0 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nto the WAL file
202e0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69  ..    ** They wi
202f0 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ll never be read
20300 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20   by any client. 
20310 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  So remove them f
20320 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20  rom the pDirty. 
20330 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e     ** list here.
20340 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a   */.    PgHdr **
20350 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b  ppNext = &pList;
20360 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a  .    nList = 0;.
20370 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
20380 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d   (*ppNext = p)!=
20390 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  0; p=p->pDirty){
203a0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
203b0 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b  no<=nTruncate ){
203c0 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20  .        ppNext 
203d0 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = &p->pDirty;.  
203e0 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20        nList++;. 
203f0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
20400 45 28 28 22 54 4f 2d 57 41 4c 20 25 64 20 70 61  E(("TO-WAL %d pa
20410 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
20420 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20430 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
20440 44 28 70 50 61 67 65 72 29 2c 20 70 2d 3e 70 67  D(pPager), p->pg
20450 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
20460 73 68 28 70 29 29 29 3b 0a 20 20 20 20 20 20 7d  sh(p)));.      }
20470 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20480 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
20490 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
204a0 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
204b0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
204c0 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
204d0 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
204e0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
204f0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
20500 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
20510 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
20520 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
20530 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
20540 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
20550 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
20560 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
20570 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
20580 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20590 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
205a0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
205b0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
205c0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
205d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
205e0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
205f0 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e  >pBackup, p->pgn
20600 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74  o, (u8 *)p->pDat
20610 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  a);.    }.  }..#
20620 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
20630 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74  CK_PAGES.  pList
20640 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
20650 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
20660 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f  ->pPCache);.  fo
20670 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
20680 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
20690 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
206a0 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  sh(p);.  }.#endi
206b0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
206c0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
206d0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
206e0 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a  n on the WAL..**
206f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20700 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c   used to be call
20710 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61  ed "pagerOpenSna
20720 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65  pshot()" because
20730 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a   it essentially.
20740 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73  ** makes a snaps
20750 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  hot of the datab
20760 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65  ase at the curre
20770 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65  nt point in time
20780 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a   and preserves.*
20790 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20  * that snapshot 
207a0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72  for use by the r
207b0 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f  eader in spite o
207c0 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63  f concurrently c
207d0 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68  hanges by.** oth
207e0 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68  er writers or ch
207f0 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  eckpointers..*/.
20800 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20810 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
20820 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
20830 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20860 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   code */.  int c
20870 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20  hanged = 0;     
20880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20890 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74  ue if cache must
208a0 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20   be reset */..  
208b0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
208c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
208d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
208e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
208f0 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
20900 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
20910 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  DER );..  /* sql
20920 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
20930 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
20940 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
20950 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
20960 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
20970 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
20980 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
20990 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
209a0 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
209b0 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
209c0 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
209d0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
209e0 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
209f0 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
20a00 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
20a10 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
20a20 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
20a30 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
20a40 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
20a50 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
20a60 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
20a70 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
20a80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20a90 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   || changed ){. 
20aa0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
20ab0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
20ac0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
20ad0 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65   ) sqlite3OsUnfe
20ae0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
20af0 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  0, 0);.  }..  re
20b00 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20b10 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
20b20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20b30 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
20b40 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20  transition from 
20b50 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f  PAGER_OPEN.** to
20b60 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
20b70 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ate to determine
20b80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20b90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
20ba0 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75  * in pages (assu
20bb0 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ming the page si
20bc0 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ze currently sto
20bd0 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67  red in Pager.pag
20be0 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  eSize)..**.** If
20bf0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20c00 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
20c10 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
20c20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20c30 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  base.** in pages
20c40 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
20c50 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  nPage. Otherwise
20c60 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
20c70 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49  (perhaps.** SQLI
20c80 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20  TE_IOERR_FSTAT) 
20c90 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
20ca0 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
20cb0 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
20cc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
20cd0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
20ce0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e  pPager, Pgno *pn
20cf0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
20d00 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
20d10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
20d20 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
20d30 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
20d40 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73   Query the WAL s
20d50 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  ub-system for th
20d60 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e  e database size.
20d70 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29   The WalDbsize()
20d80 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  .  ** function r
20d90 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74  eturns zero if t
20da0 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70  he WAL is not op
20db0 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70  en (i.e. Pager.p
20dc0 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  Wal==0), or.  **
20dd0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20de0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61   size is not ava
20df0 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61  ilable. The data
20e00 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
20e10 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
20e20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
20e30 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c  -system if the l
20e40 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  og file is empty
20e50 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   or.  ** contain
20e60 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69  s no valid commi
20e70 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
20e80 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
20e90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20ea0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20ec0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20ed0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
20ee0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20ef0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
20f00 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
20f10 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65  le==0 );.  nPage
20f20 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
20f30 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
20f40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
20f50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
20f60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20f70 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
20f80 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57   from the.  ** W
20f90 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64  AL sub-system, d
20fa0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67  etermine the pag
20fb0 65 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e  e count based on
20fc0 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a   the size of.  *
20fd0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
20fe0 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a  ile.  If the siz
20ff0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21000 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
21010 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75  .  ** integer mu
21020 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
21030 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75  ge-size, round u
21040 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  p the result..  
21050 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
21060 30 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70  0 && ALWAYS(isOp
21070 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
21080 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
21090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
210a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
210b0 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
210c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
210d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
210e0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
210f0 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  n);.    if( rc!=
21100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21110 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21120 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
21130 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
21140 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
21150 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21160 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
21170 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
21180 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
21190 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
211a0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
211b0 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
211c0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
211d0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
211e0 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
211f0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
21200 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
21210 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
21220 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
21230 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
21240 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
21250 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
21260 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
21270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21280 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
21290 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
212a0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
212b0 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
212c0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
212d0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
212e0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
212f0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
21300 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
21310 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
21320 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
21330 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
21340 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
21350 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
21360 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
21370 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
21380 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
21390 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
213a0 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
213b0 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
213c0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
213d0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
213e0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
213f0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
21400 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
21410 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
21420 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
21430 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
21440 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
21450 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
21460 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
21470 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
21480 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
21490 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
214a0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
214b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
214c0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
214d0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
214e0 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
214f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
21500 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
21510 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
21520 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
21530 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
21540 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
21550 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
21560 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
21570 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
21580 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
21590 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
215a0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
215b0 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
215c0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
215d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
215e0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
215f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
21600 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21610 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
21620 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
21630 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
21640 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21650 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
21660 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
21670 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
21680 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
21690 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
216a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
216b0 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
216c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
216d0 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
216e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
216f0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
21700 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
21710 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
21720 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
21730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21740 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
21750 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e  {.        Pgno n
21760 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
21770 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21780 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21790 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  file */..       
217a0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
217b0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
217c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
217d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
217e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  ;.        if( nP
217f0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
21800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21810 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
21820 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
21830 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Wal, 0);.       
21840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21850 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
21860 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
21870 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
21880 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
21890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
218a0 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
218b0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ger, 0);.       
218c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
218d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
218e0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
218f0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
21900 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
21910 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
21920 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21930 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
21940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21950 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
21960 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
21970 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
21980 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
21990 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
219a0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
219b0 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
219c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
219d0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
219e0 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
219f0 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
21a00 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
21a10 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
21a20 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
21a30 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
21a40 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
21a50 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
21a60 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
21a70 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
21a80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
21a90 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
21aa0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
21ab0 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
21ac0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
21ad0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
21ae0 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
21af0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
21b00 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
21b10 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
21b20 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
21b30 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
21b40 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
21b50 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
21b60 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
21b70 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
21b80 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
21b90 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
21ba0 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
21bb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
21bc0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
21bd0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
21be0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
21bf0 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
21c00 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
21c10 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
21c20 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
21c30 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
21c40 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
21c50 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
21c60 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
21c70 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
21c80 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
21c90 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
21ca0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
21cb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
21cc0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
21cd0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
21ce0 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
21cf0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
21d00 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
21d10 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
21d20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
21d30 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
21d40 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
21d50 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
21d60 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
21d70 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
21d80 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
21d90 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
21da0 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
21db0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
21dc0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
21dd0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
21de0 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
21df0 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
21e00 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
21e10 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
21e20 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
21e30 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
21e40 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
21e50 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
21e60 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
21e70 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
21e80 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
21e90 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
21ea0 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
21eb0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
21ec0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
21ed0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
21ee0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
21ef0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
21f00 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
21f10 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
21f20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
21f30 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
21f40 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
21f50 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
21f60 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
21f70 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
21f80 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
21f90 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
21fa0 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
21fb0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
21fc0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
21fd0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
21fe0 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
21ff0 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
22000 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
22010 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
22020 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
22030 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
22040 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
22050 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
22060 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
22070 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
22080 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
220a0 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
220b0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
220c0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
220d0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
220e0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
220f0 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
22100 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
22110 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
22120 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
22130 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
22140 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
22150 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
22160 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
22170 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
22180 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
22190 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
221a0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
221b0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
221c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
221d0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
221e0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f  R_LOCKED );..  /
221f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
22200 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
22210 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
22220 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
22230 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
22240 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
22250 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
22260 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
22270 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
22280 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
22290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
222a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
222b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
222c0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
222d0 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
222e0 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
222f0 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
22300 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
22310 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
22320 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
22330 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
22340 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
22350 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
22360 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
22370 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
22380 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
22390 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
223a0 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
223b0 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
223c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
223d0 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
223e0 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
223f0 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
22400 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22410 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
22420 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
22430 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
22440 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
22450 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
22460 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
22470 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
22480 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
22490 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
224a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
224b0 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
224c0 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
224d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
224e0 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
224f0 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
22500 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
22510 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
22520 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
22530 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
22540 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
22550 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
22560 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
22570 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
22580 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
22590 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
225a0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
225b0 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
225c0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
225d0 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
225e0 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
225f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
22600 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
22610 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
22620 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
22630 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
22640 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
22650 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
22660 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
22670 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
22680 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
22690 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
226a0 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
226b0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
226c0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
226d0 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
226e0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
226f0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
22700 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
22710 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
22720 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
22730 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
22740 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
22750 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
22760 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
22770 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
22780 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
22790 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
227a0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
227b0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
227c0 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
227d0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
227e0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
227f0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
22800 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
22810 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
22820 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
22830 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
22840 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
22850 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
22860 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
22870 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
22880 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
22890 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
228a0 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
228b0 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
228c0 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
228d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
228e0 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
228f0 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
22900 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
22910 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
22920 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
22930 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
22940 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
22950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22960 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22970 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
22980 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
22990 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
229a0 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
229b0 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
229c0 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
229d0 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
229e0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
229f0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
22a00 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
22a10 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
22a20 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
22a30 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
22a40 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
22a50 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
22a60 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
22a70 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
22a80 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
22a90 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
22aa0 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
22ab0 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
22ac0 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
22ad0 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
22ae0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
22af0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
22b00 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
22b10 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
22b20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
22b30 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
22b40 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
22b50 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
22b60 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
22b70 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
22b80 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
22b90 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
22ba0 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
22bb0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
22bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
22bd0 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
22be0 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
22bf0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
22c00 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
22c10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
22c20 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
22c30 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
22c40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22c50 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
22c60 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22c70 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
22c80 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
22c90 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
22ca0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
22cb0 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
22cc0 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
22cd0 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
22ce0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
22cf0 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
22d00 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
22d10 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
22d20 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
22d30 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
22d40 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
22d50 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
22d60 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
22d70 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
22d80 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
22d90 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
22da0 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
22db0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
22dc0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
22dd0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
22de0 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e  = (i64)pSavepoin
22df0 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
22e00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
22e10 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
22e20 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
22e30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22e40 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
22e50 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
22e60 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57  , pSavepoint->aW
22e70 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  alData);.    }. 
22e80 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70     for(ii=pSavep
22e90 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72  oint->iSubRec; r
22ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22eb0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  ii<pPager->nSubR
22ec0 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
22ed0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d   assert( offset=
22ee0 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67  =(i64)ii*(4+pPag
22ef0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
22f00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22f10 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
22f20 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
22f30 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
22f40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22f50 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22f60 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
22f70 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
22f80 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
22f90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22fa0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
22fb0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
22fc0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
22fd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
22fe0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
22ff0 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
23000 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
23010 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66  e allowed.** bef
23020 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
23030 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20  o recycle clean 
23040 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73  and unused pages
23050 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23060 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
23070 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
23080 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
23090 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
230a0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
230b0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
230c0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ge);.}../*.** Ch
230d0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
230e0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
230f0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
23100 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62  are allowed.** b
23110 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
23120 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20   to spill pages 
23130 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  to journal..*/.i
23140 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
23150 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65  etSpillsize(Page
23160 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
23170 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  xPage){.  return
23180 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
23190 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65  tSpillsize(pPage
231a0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
231b0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ge);.}../*.** In
231c0 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  voke SQLITE_FCNT
231d0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65  L_MMAP_SIZE base
231e0 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
231f0 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70   value of szMmap
23200 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23210 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
23220 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
23230 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
23240 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73  _MMAP_SIZE>0.  s
23250 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
23260 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20  = pPager->fd;.  
23270 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26  if( isOpen(fd) &
23280 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  & fd->pMethods->
23290 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20  iVersion>=3 ){. 
232a0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
232b0 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50   sz;.    sz = pP
232c0 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20  ager->szMmap;.  
232d0 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65    pPager->bUseFe
232e0 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20  tch = (sz>0);.  
232f0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
23300 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73  d(pPager);.    s
23310 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
23320 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
23330 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
23340 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
23350 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
23360 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
23370 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
23380 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70   any memory mapp
23390 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20  ing made of the 
233a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
233b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
233c0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
233d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
233e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
233f0 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  map){.  pPager->
23400 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
23410 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  .  pagerFixMapli
23420 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  mit(pPager);.}..
23430 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75  /*.** Free as mu
23440 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
23450 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  sible from the p
23460 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ager..*/.void sq
23470 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
23480 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
23490 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
234a0 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70  Shrink(pPager->p
234b0 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
234c0 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67  * Adjust setting
234d0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74  s of the pager t
234e0 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
234f0 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73  d in the pgFlags
23500 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
23510 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e  * The "level" in
23520 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
23530 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
23540 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73  K sets the robus
23550 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tness.** of the 
23560 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
23570 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
23580 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61  shes or power fa
23590 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61  ilures by.** cha
235a0 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
235b0 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
235c0 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  n writing the jo
235d0 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65  urnals..** There
235e0 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73   are four levels
235f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
23600 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
23610 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
23620 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
23630 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
23640 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
23650 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
23660 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
23670 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
23680 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
23690 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
236a0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
236b0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
236c0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
236d0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
236e0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
236f0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
23700 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
23710 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
23720 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
23730 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
23740 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23750 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
23760 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
23770 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
23780 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
23790 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
237a0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
237b0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
237c0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
237e0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
237f0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
23800 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
23810 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
23820 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
23830 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
23840 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
23850 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
23860 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
23870 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
23880 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
23890 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
238a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
238b0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
238c0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
238d0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
238e0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
238f0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
23900 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
23910 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
23920 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
23930 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
23940 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
23950 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
23960 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
23970 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
23980 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
23990 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
239a0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
239b0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
239c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
239d0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
239e0 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20  **.**    EXTRA  
239f0 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20     This is like 
23a00 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74  FULL except that
23a10 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74   is also syncs t
23a20 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
23a40 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  t contains the r
23a50 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
23a60 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61  after the rollba
23a70 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ck.**           
23a80 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e     journal is un
23a90 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  linked..**.** Th
23aa0 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
23ab0 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
23ac0 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
23ad0 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
23ae0 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
23af0 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
23b00 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
23b10 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
23b20 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
23b30 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
23b40 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
23b50 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
23b60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23b70 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
23b80 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
23b90 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
23ba0 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
23bb0 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
23bc0 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
23bd0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
23be0 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
23bf0 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
23c00 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
23c10 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
23c20 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
23c30 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
23c40 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
23c50 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
23c60 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
23c70 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
23c80 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
23c90 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
23ca0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23cb0 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69  NORMAL.  There i
23cc0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
23cd0 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20  between FULL.** 
23ce0 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41  and EXTRA for WA
23cf0 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  L mode..**.** Do
23d00 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
23d10 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
23d20 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
23d30 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
23d40 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
23d50 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
23d60 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
23d70 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
23d80 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
23d90 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
23da0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
23db0 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
23dc0 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
23dd0 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
23de0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
23df0 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
23e00 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
23e10 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
23e20 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
23e30 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
23e40 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
23e50 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
23e60 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
23e70 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
23e80 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
23e90 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
23ea0 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
23eb0 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
23ec0 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
23ed0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
23ee0 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
23ef0 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
23f00 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
23f10 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
23f20 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
23f30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23f40 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
23f50 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23f60 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67  rSetFlags(.  Pag
23f70 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23f80 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
23f90 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
23fa0 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73  vel for */.  uns
23fb0 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
23fc0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
23fd0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ags */.){.  unsi
23fe0 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46  gned level = pgF
23ff0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
24000 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20  CHRONOUS_MASK;. 
24010 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
24020 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
24030 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
24040 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
24050 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  lSync = 0;.    p
24060 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
24070 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
24080 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
24090 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45  c =  level==PAGE
240a0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
240b0 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  F ?1:0;.    pPag
240c0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
240d0 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43  evel>=PAGER_SYNC
240e0 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a  HRONOUS_FULL ?1:
240f0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
24100 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c  xtraSync = level
24110 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  ==PAGER_SYNCHRON
24120 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a  OUS_EXTRA ?1:0;.
24130 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
24140 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
24150 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
24160 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  s = 0;.  }else i
24170 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
24180 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  ER_FULLFSYNC ){.
24190 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
241a0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
241b0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
241c0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
241d0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
241e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
241f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c   }.  pPager->wal
24200 53 79 6e 63 46 6c 61 67 73 20 3d 20 28 70 50 61  SyncFlags = (pPa
24210 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3c 3c  ger->syncFlags<<
24220 32 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  2);.  if( pPager
24230 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
24240 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
24250 63 46 6c 61 67 73 20 7c 3d 20 70 50 61 67 65 72  cFlags |= pPager
24260 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 7d  ->syncFlags;.  }
24270 0a 20 20 69 66 28 20 28 70 67 46 6c 61 67 73 20  .  if( (pgFlags 
24280 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c  & PAGER_CKPT_FUL
24290 4c 46 53 59 4e 43 29 20 26 26 20 21 70 50 61 67  LFSYNC) && !pPag
242a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
242b0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
242c0 63 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54  cFlags |= (SQLIT
242d0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32 29 3b  E_SYNC_FULL<<2);
242e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61  .  }.  if( pgFla
242f0 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45  gs & PAGER_CACHE
24300 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61  SPILL ){.    pPa
24310 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
24320 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  &= ~SPILLFLAG_OF
24330 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  F;.  }else{.    
24340 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
24350 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
24360 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  OFF;.  }.}.#endi
24370 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
24380 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
24390 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
243a0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
243b0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
243c0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
243d0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
243e0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
243f0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
24400 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
24410 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
24420 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
24430 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
24440 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
24450 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
24460 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
24470 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
24480 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
24490 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
244a0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
244b0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
244c0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
244d0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
244e0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
244f0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
24500 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
24510 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
24520 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
24530 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
24540 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
24550 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
24560 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
24570 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
24580 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
24590 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
245a0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
245b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
245c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
245d0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
245e0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
245f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
24600 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
24610 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
24620 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
24630 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
24640 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
24650 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
24660 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
24670 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
24680 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
24690 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
246a0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
246b0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
246c0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
246d0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
246e0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
246f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
24700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24710 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
24720 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
24730 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
24740 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
24750 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
24760 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
24770 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
24780 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
24790 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
247a0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
247b0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
247c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
247d0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
247e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
247f0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
24800 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
24810 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
24820 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
24830 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
24840 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
24850 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
24860 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24870 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
24880 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
24890 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
248a0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
248b0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
248c0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
248d0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
248e0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
248f0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
24900 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
24910 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
24920 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
24930 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
24940 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
24950 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
24960 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
24970 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
24980 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
24990 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
249a0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
249b0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
249c0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
249d0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
249e0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
249f0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
24a00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
24a10 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
24a20 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
24a30 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
24a40 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
24a50 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
24a60 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
24a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
24aa0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
24ab0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
24ac0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
24ad0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
24ae0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
24af0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
24b00 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
24b10 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
24b20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
24b30 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
24b40 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
24b50 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
24b60 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
24b70 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
24b80 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
24b90 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
24ba0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
24bb0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
24bc0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
24bd0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
24be0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
24bf0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
24c00 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
24c10 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
24c20 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
24c30 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
24c60 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
24c70 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
24c80 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
24c90 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
24ca0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
24cb0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
24cc0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
24cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
24ce0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
24cf0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
24d00 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  .){.  pPager->xB
24d10 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
24d20 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
24d30 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
24d40 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
24d50 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69  lerArg;..  if( i
24d60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24d70 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ) ){.    void **
24d80 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
24d90 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
24da0 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ler;.    assert(
24db0 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a   ((int(*)(void *
24dc0 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73  ))(ap[0]))==xBus
24dd0 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20  yHandler );.    
24de0 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
24df0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
24e00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
24e10 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
24e20 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
24e30 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
24e40 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
24e50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
24e60 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
24e70 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
24e80 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
24e90 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
24ea0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
24eb0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
24ec0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24ed0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
24ee0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
24ef0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24f00 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
24f10 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
24f20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
24f30 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
24f40 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
24f50 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
24f60 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
24f70 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
24f80 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
24f90 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
24fa0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
24fb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
24fc0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
24fd0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
24fe0 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
24ff0 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
25000 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
25010 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
25020 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
25030 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
25040 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
25050 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
25060 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
25070 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
25080 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
25090 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
250a0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
250b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
250c0 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
250d0 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
250e0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
250f0 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
25100 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
25110 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
25120 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
25130 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
25140 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
25150 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
25160 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
25170 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
25180 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
25190 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
251a0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
251b0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
251c0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
251d0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
251e0 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
251f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
25200 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
25210 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
25220 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
25230 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
25240 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
25250 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
25260 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
25270 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
25280 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
25290 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
252a0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
252b0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
252c0 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
252d0 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
252e0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
252f0 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
25300 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
25310 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
25320 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
25330 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
25340 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
25350 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
25360 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
25370 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
25380 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
25390 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
253a0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
253b0 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
253c0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
253d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
253e0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
253f0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
25400 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
25410 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
25420 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
25430 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
25440 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
25450 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
25460 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
25470 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
25480 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
25490 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
254a0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
254b0 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
254c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
254d0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
254e0 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
254f0 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
25500 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
25510 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
25520 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
25530 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
25540 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
25550 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
25560 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
25570 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
25580 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
25590 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
255a0 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
255b0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
255c0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
255d0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
255e0 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
255f0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
25600 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
25610 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
25620 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
25630 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
25640 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
25650 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
25660 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
25670 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
25680 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
25690 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
256a0 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
256b0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
256c0 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
256d0 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
256e0 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
256f0 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
25700 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
25710 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
25720 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
25730 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
25740 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
25750 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
25760 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
25770 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25780 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
25790 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
257a0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
257b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
257c0 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
257d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
257e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
257f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25800 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
25810 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
25820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
25830 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
25840 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25850 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
25860 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25880 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
25890 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
258a0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
258b0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
258c0 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
258d0 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
258e0 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
258f0 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
25900 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
25910 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
25920 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
25930 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
25940 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
25950 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
25960 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
25970 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
25980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25990 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
259a0 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
259b0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
259c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
259d0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
259e0 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
259f0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
25a00 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
25a10 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
25a20 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
25a30 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
25a40 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
25a50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25a60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25a70 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
25a80 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
25a90 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
25aa0 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
25ab0 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
25ac0 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
25ad0 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
25ae0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
25af0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
25b00 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
25b10 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
25b20 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
25b30 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
25b40 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
25b50 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
25b60 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
25b70 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
25b80 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
25b90 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
25ba0 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
25bb0 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
25bc0 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
25bd0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
25be0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
25bf0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
25c00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
25c10 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
25c20 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
25c30 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
25c40 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
25c50 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
25c60 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
25c70 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
25c80 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
25c90 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
25ca0 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
25cb0 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
25cc0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
25cd0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
25ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
25cf0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
25d00 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
25d10 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
25d20 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
25d30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25d40 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
25d50 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
25d60 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
25d70 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
25d80 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
25d90 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
25da0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25db0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
25dc0 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
25dd0 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
25de0 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
25df0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25e00 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
25e10 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
25e20 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
25e30 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
25e40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
25e50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
25e60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
25e70 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
25e80 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
25e90 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
25ea0 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
25eb0 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
25ec0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
25ed0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
25ee0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
25ef0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
25f00 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
25f10 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
25f20 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
25f30 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
25f40 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
25f50 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
25f60 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
25f70 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
25f80 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
25f90 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
25fa0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
25fb0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
25fc0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
25fd0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
25fe0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
25ff0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
26000 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
26010 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
26020 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
26030 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
26040 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
26050 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
26060 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
26070 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
26080 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
26090 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
260a0 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
260b0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
260c0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
260d0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
260e0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
260f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
26100 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
26110 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
26120 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
26130 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
26140 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
26150 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
26160 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
26170 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
26180 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
26190 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
261a0 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
261b0 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
261c0 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
261d0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
261e0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
261f0 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
26200 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
26210 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
26220 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
26230 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
26240 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
26250 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
26260 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
26270 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
26280 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
26290 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
262a0 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
262b0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
262c0 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
262d0 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
262e0 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
262f0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
26300 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
26310 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
26320 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
26330 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
26340 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
26350 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
26360 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
26370 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26380 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
26390 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
263a0 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
263b0 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
263c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
263d0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
263e0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
263f0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
26400 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
26410 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
26420 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
26430 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
26440 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
26450 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
26460 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
26470 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
26480 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
26490 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
264a0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
264b0 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
264c0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
264d0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
264e0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
264f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
26500 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
26510 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
26520 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
26530 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
26540 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
26550 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
26560 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
26570 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
26580 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
26590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
265a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
265b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
265c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
265d0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
265e0 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
265f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
26600 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
26610 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
26620 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
26630 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
26640 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
26650 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
26660 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
26670 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
26680 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
26690 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
266a0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
266b0 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
266c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
266d0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
266e0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
266f0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
26700 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26710 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
26720 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26730 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
26740 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
26750 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
26760 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
26770 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
26780 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
26790 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
267a0 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
267b0 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
267c0 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
267d0 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
267e0 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
267f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26800 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
26810 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
26820 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
26830 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
26840 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
26850 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
26860 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
26870 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
26880 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
26890 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
268a0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
268b0 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
268c0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
268d0 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
268e0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
268f0 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
26900 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
26910 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
26920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26930 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
26940 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
26950 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
26960 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
26970 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
26980 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
26990 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
269a0 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
269b0 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
269c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
269d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
269e0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
269f0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
26a00 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
26a10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26a40 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
26a50 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
26a60 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
26a70 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
26a80 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
26a90 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
26aa0 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
26ab0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
26ac0 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
26ad0 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
26ae0 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
26af0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
26b00 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
26b10 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
26b20 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
26b30 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
26b40 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
26b50 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
26b60 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
26b70 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
26b80 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
26b90 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
26ba0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
26bb0 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
26bc0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
26bd0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
26be0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
26bf0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
26c00 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
26c10 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
26c20 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
26c30 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
26c40 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
26c50 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
26c60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26c70 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
26c80 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26c90 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
26ca0 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
26cb0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
26cc0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
26cd0 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
26ce0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
26cf0 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
26d00 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
26d10 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
26d20 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
26d30 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
26d40 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
26d50 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
26d60 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
26d70 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
26d80 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
26d90 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
26da0 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
26db0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
26dc0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
26dd0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
26de0 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
26df0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
26e00 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
26e10 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
26e20 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
26e30 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
26e40 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
26e50 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
26e60 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
26e70 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
26e80 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
26e90 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
26ea0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
26eb0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
26ec0 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
26ed0 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
26ee0 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
26ef0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
26f00 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
26f10 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
26f20 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
26f30 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
26f40 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
26f50 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
26f60 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
26f70 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
26f80 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
26f90 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
26fa0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
26fb0 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
26fc0 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
26fd0 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
26fe0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
26ff0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27000 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
27010 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
27020 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
27030 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
27040 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
27050 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
27060 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
27070 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
27080 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
27090 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
270a0 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
270b0 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
270c0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
270d0 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
270e0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
270f0 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
27100 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
27110 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
27120 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
27130 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
27140 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
27150 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
27160 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
27170 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
27180 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
27190 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
271a0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
271b0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
271c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
271d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
271e0 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
271f0 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
27200 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
27210 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
27220 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
27230 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
27240 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
27250 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
27260 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
27270 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
27280 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
27290 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
272a0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
272b0 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
272c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
272d0 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
272e0 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
272f0 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
27300 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
27310 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
27320 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
27330 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
27340 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
27350 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
27360 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
27370 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
27380 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
27390 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
273a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
273b0 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
273c0 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
273d0 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
273e0 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
273f0 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
27400 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
27410 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
27420 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
27430 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
27440 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
27450 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
27460 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
27470 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
27480 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
27490 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
274a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
274b0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
274c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
274d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
274e0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
274f0 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
27500 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
27510 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
27520 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
27530 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
27540 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
27550 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
27560 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
27570 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
27580 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
27590 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
275a0 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
275b0 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
275c0 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
275d0 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
275e0 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
275f0 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
27600 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
27610 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
27620 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
27630 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
27640 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
27650 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27660 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
27670 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
27680 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
27690 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
276a0 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
276b0 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
276c0 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
276d0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
276e0 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
276f0 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
27700 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
27710 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
27720 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
27730 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
27740 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
27750 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
27760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27770 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
27780 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
27790 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
277a0 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
277b0 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
277c0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
277d0 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
277e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
277f0 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
27800 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27810 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
27820 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
27830 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
27840 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
27850 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
27860 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
27870 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
27880 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
27890 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
278a0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
278b0 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
278c0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
278d0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
278e0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
278f0 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
27900 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
27910 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
27920 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
27930 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
27940 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
27950 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
27960 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
27970 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
27980 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
27990 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
279a0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
279b0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
279c0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
279d0 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
279e0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
279f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
27a00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27a10 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
27a20 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
27a30 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
27a40 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
27a50 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
27a60 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
27a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
27a80 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
27a90 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
27aa0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
27ab0 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
27ac0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
27ad0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27ae0 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74  SIZE>0./*.** Obt
27af0 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
27b00 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70  to a memory mapp
27b10 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66  ed page object f
27b20 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  or page number p
27b30 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77  gno. .** The new
27b40 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65   object will use
27b50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61   the pointer pDa
27b60 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ta, obtained fro
27b70 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49  m xFetch()..** I
27b80 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
27b90 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69  t *ppPage to poi
27ba0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
27bb0 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  ge reference.** 
27bc0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
27bd0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
27be0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
27bf0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
27c00 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20   set.** *ppPage 
27c10 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50  to zero..**.** P
27c20 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f  age references o
27c30 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
27c40 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
27c50 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61   should be relea
27c60 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e  sed.** by callin
27c70 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  g pagerReleaseMa
27c80 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
27c90 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
27ca0 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61  ireMapPage(.  Pa
27cb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27cd0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
27ce0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
27d10 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61  r */.  void *pDa
27d20 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
27d30 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
27d40 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68  ()'d data for th
27d50 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
27d60 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  dr **ppPage     
27d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d80 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61  OUT: Acquired pa
27d90 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ge object */.){.
27da0 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
27dd0 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72  ed page to retur
27de0 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50  n */.  .  if( pP
27df0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27e00 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ist ){.    *ppPa
27e10 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
27e20 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
27e30 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61      pPager->pMma
27e40 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70  pFreelist = p->p
27e50 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
27e60 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  irty = 0;.    as
27e70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45  sert( pPager->nE
27e80 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d  xtra>=8 );.    m
27e90 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c  emset(p->pExtra,
27ea0 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 8);.  }else{
27eb0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
27ec0 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69   = (PgHdr *)sqli
27ed0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
27ee0 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50  zeof(PgHdr) + pP
27ef0 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
27f00 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
27f10 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
27f20 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
27f30 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20  , (i64)(pgno-1) 
27f40 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
27f50 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
27f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27f70 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27f80 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
27f90 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
27fa0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
27fb0 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
27fc0 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
27fd0 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
27fe0 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
27ff0 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
28000 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
28010 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
28020 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
28030 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
28040 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
28050 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
28060 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
28070 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
28080 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
28090 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
280a0 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
280b0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
280c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
280d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
280e0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
280f0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
28100 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
28110 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
28120 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
28130 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
28140 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
28150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28160 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
28170 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
28180 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
28190 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
281a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
281b0 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
281c0 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
281d0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
281e0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
281f0 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
28200 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28210 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
28220 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
28230 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
28240 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
28250 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
28260 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
28270 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
28280 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
28290 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
282a0 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
282b0 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
282c0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
282d0 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
282e0 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
282f0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
28300 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
28310 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
28320 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
28330 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
28340 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
28350 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
28360 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
28370 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
28380 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
28390 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
283a0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
283b0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
283c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
283d0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
283e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
283f0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
28400 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
28410 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
28420 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
28430 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
28440 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
28450 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
28460 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
28470 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
28480 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
28490 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
284a0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
284b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
284c0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
284d0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
284e0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
284f0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
28500 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
28510 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
28520 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
28530 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
28540 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
28550 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
28560 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
28570 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
28580 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
28590 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
285a0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
285b0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
285c0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
285d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
285e0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
285f0 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29  er, sqlite3 *db)
28600 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
28610 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
28620 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
28630 74 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55 73  t( db || pagerUs
28640 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
28650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
28660 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28670 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73  pPager) );.  dis
28680 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
28690 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
286a0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
286b0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65  Malloc();.  page
286c0 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61  rFreeMapHdrs(pPa
286d0 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ger);.  /* pPage
286e0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
286f0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
28700 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
28710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28720 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74  MIT_WAL.  assert
28730 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ( db || pPager->
28740 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  pWal==0 );.  sql
28750 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
28760 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70  ger->pWal, db, p
28770 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
28780 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
28790 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 28 64 62  eSize,.      (db
287a0 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
287b0 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e   SQLITE_NoCkptOn
287c0 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70 54 6d  Close) ? 0 : pTm
287d0 70 29 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 72  p).  );.  pPager
287e0 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64  ->pWal = 0;.#end
287f0 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  if.  pager_reset
28800 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
28810 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
28820 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
28830 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28840 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e  /* If it is open
28850 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
28860 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  al file before c
28870 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64  alling UnlockAnd
28880 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a  Rollback..    **
28890 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
288a0 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e  done, then an un
288b0 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
288c0 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
288d0 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  al .    ** file 
288e0 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61  may be played ba
288f0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
28900 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
28910 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
28920 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68  .    ** while th
28930 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
28940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
28950 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
28960 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  pt..    **.    *
28970 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
28980 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
28990 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  g to sync the jo
289a0 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65  urnal, shift the
289b0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e   pager.    ** in
289c0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
289d0 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  te. This causes 
289e0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
289f0 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  k to unlock the.
28a00 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
28a10 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  and close the jo
28a20 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f  urnal file witho
28a30 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ut attempting to
28a40 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20   roll it.    ** 
28a50 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65  back or finalize
28a60 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61   it. The next da
28a70 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c  tabase user will
28a80 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d   have to do hot-
28a90 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72  journal.    ** r
28aa0 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ollback before a
28ab0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
28ac0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
28ad0 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  */.    if( isOpe
28ae0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
28af0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
28b00 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65  ror(pPager, page
28b10 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
28b20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
28b30 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
28b40 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
28b50 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
28b60 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
28b70 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
28b80 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
28b90 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
28ba0 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
28bb0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28bc0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
28bd0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
28be0 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
28bf0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
28c00 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  d);.  sqlite3OsC
28c10 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
28c20 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
28c30 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c  ree(pTmp);.  sql
28c40 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
28c50 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
28c60 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
28c70 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
28c80 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
28c90 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
28ca0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
28cb0 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
28cc0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
28cd0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
28ce0 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
28cf0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
28d00 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
28d10 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
28d20 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
28d30 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
28d40 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
28d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28d60 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
28d70 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
28d80 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
28d90 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
28da0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
28db0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
28dc0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
28dd0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
28de0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
28df0 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
28e00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
28e10 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
28e20 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
28e30 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
28e40 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
28e50 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
28e60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
28e70 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
28e80 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
28e90 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
28ea0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
28eb0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
28ec0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
28ed0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
28ee0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
28ef0 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
28f00 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
28f10 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
28f20 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
28f30 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
28f40 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
28f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
28f60 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
28f70 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
28f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
28f90 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
28fa0 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
28fb0 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
28fc0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
28fd0 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
28fe0 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
28ff0 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
29000 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
29010 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
29020 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
29030 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
29040 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
29050 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
29060 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
29070 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
29080 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
29090 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
290a0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
290b0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
290c0 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
290d0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
290e0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
290f0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
29100 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
29110 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
29120 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
29130 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
29140 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
29150 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
29160 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
29170 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
29180 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
29190 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
291a0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
291b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
291c0 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
291d0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
291e0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
291f0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
29200 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
29210 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
29220 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
29230 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
29240 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
29250 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
29260 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
29270 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
29280 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
29290 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
292a0 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
292b0 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
292c0 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
292d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
292e0 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
292f0 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
29300 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
29310 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
29320 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
29330 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
29340 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
29350 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
29360 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
29370 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
29380 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
29390 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
293a0 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
293b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
293c0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
293d0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
293e0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
293f0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
29400 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
29410 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
29420 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
29430 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
29440 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64  Pager, int newHd
29450 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
29460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29470 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29480 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
29490 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
294a0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
294b0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
294c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
294d0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
294e0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
294f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
29500 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
29510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
29520 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29530 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
29540 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
29550 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 2c 20 30  veLock(pPager, 0
29560 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
29570 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29580 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
29590 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
295a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
295b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
295c0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
295d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
295e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
295f0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
29600 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
29610 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
29620 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
29630 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
29640 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
29650 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
29660 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
29670 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
29680 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
29690 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
296a0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
296b0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
296c0 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
296d0 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
296e0 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
296f0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
29700 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
29710 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
29720 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
29730 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
29740 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
29750 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
29760 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
29770 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
29780 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
29790 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
297a0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
297b0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
297c0 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
297d0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
297e0 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
297f0 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
29800 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
29810 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
29820 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
29830 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
29840 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
29850 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
29860 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
29870 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
29880 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
29890 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
298a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
298b0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
298c0 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
298d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
298e0 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
298f0 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
29900 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
29910 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
29920 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
29930 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
29940 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
29950 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
29960 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
29970 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
29980 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
29990 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
299a0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
299b0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
299c0 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
299d0 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
299e0 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
299f0 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
29a00 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
29a10 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
29a20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29a30 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29a40 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
29a50 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
29a60 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
29a70 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
29a80 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
29a90 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
29aa0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
29ab0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
29ac0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
29ad0 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
29ae0 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
29af0 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
29b00 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29b10 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
29b20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
29b30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
29b40 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
29b50 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
29b60 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
29b70 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
29b80 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
29b90 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
29ba0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
29bb0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
29bc0 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
29bd0 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
29be0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
29bf0 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
29c00 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
29c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29c20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
29c30 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
29c40 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
29c50 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
29c60 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29c70 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
29c80 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
29c90 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
29ca0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
29cb0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
29cc0 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
29cd0 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
29ce0 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
29cf0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
29d00 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
29d10 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
29d20 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
29d30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29d40 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
29d50 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
29d60 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
29d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
29d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
29d90 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
29da0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
29db0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
29dc0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
29dd0 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
29de0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29df0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
29e00 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
29e10 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
29e20 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
29e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
29e50 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
29e60 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
29e70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29e80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
29e90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
29ea0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
29eb0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
29ec0 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
29ed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
29ee0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
29ef0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
29f00 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
29f10 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
29f20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
29f30 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
29f40 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
29f50 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
29f60 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
29f70 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
29f80 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
29f90 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
29fa0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
29fb0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
29fc0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
29fd0 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
29fe0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
29ff0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
2a000 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
2a010 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
2a020 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
2a030 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
2a040 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
2a050 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
2a060 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
2a070 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
2a080 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
2a090 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
2a0a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
2a0b0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
2a0c0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
2a0d0 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
2a0e0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
2a0f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2a100 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2a110 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
2a120 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
2a130 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
2a140 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a150 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
2a160 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2a170 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
2a180 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
2a190 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
2a1a0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
2a1b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2a1c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2a1d0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
2a1e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2a1f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a200 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a210 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
2a220 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
2a230 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
2a240 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
2a250 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
2a260 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2a270 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
2a280 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
2a290 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
2a2a0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
2a2b0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
2a2c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a2d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a2e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a2f0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
2a300 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
2a310 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
2a320 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
2a330 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
2a340 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
2a350 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2a360 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2a370 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
2a380 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
2a390 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
2a3a0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
2a3b0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2a3c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
2a3d0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
2a3e0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
2a3f0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
2a400 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
2a410 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2a420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a440 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
2a450 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2a460 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a470 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
2a480 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
2a490 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
2a4a0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
2a4b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
2a4c0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
2a4d0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
2a4e0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
2a4f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a500 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a510 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2a520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
2a530 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2a540 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2a550 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
2a560 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
2a570 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
2a580 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
2a590 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
2a5a0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
2a5b0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
2a5c0 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
2a5d0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
2a5e0 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
2a5f0 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
2a600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
2a610 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
2a620 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2a630 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
2a640 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
2a650 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
2a660 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2a670 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2a680 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a690 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2a6a0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
2a6b0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
2a6c0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
2a6d0 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
2a6e0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
2a6f0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
2a700 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
2a710 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
2a720 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
2a730 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
2a740 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
2a750 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2a760 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
2a770 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
2a780 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
2a790 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
2a7a0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2a7b0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
2a7c0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
2a7d0 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
2a7e0 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
2a7f0 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
2a800 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
2a810 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
2a820 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
2a830 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a840 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
2a850 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
2a860 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2a870 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
2a880 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
2a890 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
2a8a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2a8b0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
2a8c0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2a8d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
2a8e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2a8f0 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
2a900 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
2a910 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
2a920 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
2a930 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
2a940 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
2a950 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
2a960 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
2a970 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
2a980 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
2a990 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
2a9a0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
2a9b0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
2a9c0 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
2a9d0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
2a9e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2a9f0 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
2aa00 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
2aa10 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
2aa20 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
2aa30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2aa40 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
2aa50 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
2aa60 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
2aa70 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
2aa80 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
2aa90 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
2aaa0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
2aab0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
2aac0 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
2aad0 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
2aae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2aaf0 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
2ab00 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
2ab10 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
2ab20 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
2ab30 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
2ab40 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
2ab50 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
2ab60 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
2ab70 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
2ab80 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
2ab90 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
2aba0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2abb0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
2abc0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
2abd0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2abe0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2abf0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2ac00 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
2ac10 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2ac20 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
2ac30 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
2ac40 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
2ac50 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
2ac60 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2ac70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
2ac80 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
2ac90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
2aca0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
2acb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2acc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2acd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ace0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
2acf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
2ad00 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
2ad10 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
2ad20 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
2ad30 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
2ad40 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2ad50 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
2ad60 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2ad70 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  le || pPager->eS
2ad80 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2ad90 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
2ada0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
2adb0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
2adc0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2add0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ade0 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44  fd) || pList->pD
2adf0 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
2ae00 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
2ae10 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
2ae20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2ae30 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
2ae40 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
2ae50 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
2ae60 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
2ae70 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2ae80 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
2ae90 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
2aea0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2aeb0 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
2aec0 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
2aed0 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
2aee0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
2aef0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2af00 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
2af10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2af20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2af30 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2af40 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2af50 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
2af60 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
2af70 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
2af80 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
2af90 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
2afa0 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
2afb0 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
2afc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
2afd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2afe0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2aff0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
2b000 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70  LITE_OK .   && p
2b010 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2b020 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
2b030 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70  .   && (pList->p
2b040 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e  Dirty || pList->
2b050 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48  pgno>pPager->dbH
2b060 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20  intSize).  ){.  
2b070 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2b080 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
2b090 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
2b0a0 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
2b0b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
2b0c0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
2b0d0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
2b0e0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
2b0f0 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
2b100 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
2b110 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
2b120 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2b130 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
2b140 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2b150 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
2b160 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
2b170 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
2b180 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
2b190 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
2b1a0 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
2b1b0 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
2b1c0 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
2b1d0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
2b1e0 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
2b1f0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
2b200 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
2b210 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
2b220 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
2b230 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
2b240 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
2b250 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
2b260 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
2b270 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
2b280 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
2b290 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
2b2a0 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
2b2b0 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
2b2c0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
2b2d0 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
2b2e0 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
2b2f0 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
2b300 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
2b310 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
2b320 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
2b330 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
2b340 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
2b350 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
2b360 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
2b370 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
2b380 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
2b390 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
2b3a0 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2b3d0 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
2b3e0 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
2b3f0 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
2b400 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2b410 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b420 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
2b430 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
2b440 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
2b450 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
2b460 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
2b470 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
2b480 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
2b490 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
2b4a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b4b0 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29  MEM_BKPT, pData)
2b4c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
2b4d0 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
2b4e0 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
2b4f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2b500 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
2b510 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
2b520 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
2b530 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
2b540 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
2b550 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
2b560 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
2b570 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
2b580 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
2b590 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
2b5a0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
2b5b0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
2b5c0 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
2b5d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b5e0 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
2b5f0 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
2b600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2b610 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
2b620 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2b630 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2b640 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
2b650 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
2b660 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
2b670 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
2b680 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
2b690 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2b6a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2b6b0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
2b6c0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2b6d0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
2b6e0 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
2b6f0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
2b700 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
2b710 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
2b720 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
2b730 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
2b740 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
2b750 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2b760 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
2b770 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
2b780 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b790 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2b7a0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7c0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2b7d0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
2b7e0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
2b7f0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
2b800 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
2b810 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
2b820 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
2b830 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
2b840 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
2b850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b860 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b870 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
2b880 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2b890 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
2b8a0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
2b8b0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
2b8c0 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
2b8d0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2b8e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2b8f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
2b900 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
2b910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2b920 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
2b930 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
2b940 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
2b950 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2b960 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2b970 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
2b980 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
2b990 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
2b9a0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
2b9b0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
2b9c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
2b9d0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2b9e0 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
2b9f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2ba00 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2ba10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ba20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ba30 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
2ba40 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2ba50 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ) ){.    const i
2ba60 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49  nt flags =  SQLI
2ba70 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2ba80 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL | SQLITE_OPEN
2ba90 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20  _READWRITE .    
2baa0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2bab0 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
2bac0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a  OPEN_EXCLUSIVE .
2bad0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
2bae0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2baf0 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74  E;.    int nStmt
2bb00 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43  Spill = sqlite3C
2bb10 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c  onfig.nStmtSpill
2bb20 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
2bb30 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2bb40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bb50 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
2bb60 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
2bb70 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70  ){.      nStmtSp
2bb80 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ill = -1;.    }.
2bb90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bba0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2bbb0 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61  er->pVfs, 0, pPa
2bbc0 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73  ger->sjfd, flags
2bbd0 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20  , nStmtSpill);. 
2bbe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2bbf0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
2bc00 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
2bc10 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
2bc20 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
2bc30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
2bc40 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2bc50 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
2bc60 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2bc70 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
2bc80 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
2bc90 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
2bca0 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
2bcb0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
2bcc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2bcd0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
2bce0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2bcf0 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
2bd00 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
2bd10 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2bd20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
2bd30 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
2bd40 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
2bd50 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
2bd60 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
2bd70 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
2bd80 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
2bd90 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
2bda0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2bdb0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2bdc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2bdd0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
2bde0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2bdf0 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
2be00 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2be10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2be20 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
2be30 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2be40 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
2be50 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
2be60 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
2be70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2be80 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2be90 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2bea0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2beb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2bec0 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
2bed0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2bee0 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
2bef0 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
2bf00 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2bf10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2bf20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
2bf30 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
2bf40 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20  r, pPg) .       
2bf50 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
2bf60 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2bf70 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
2bf80 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2bf90 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
2bfa0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
2bfb0 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
2bfc0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
2bfd0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
2bfe0 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
2bff0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
2c000 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
2c010 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2c020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c030 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
2c040 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2c050 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2c060 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
2c070 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
2c080 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
2c090 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2c0a0 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  2;..#if SQLITE_H
2c0b0 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20  AS_CODEC   .    
2c0c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
2c0d0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2c0e0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2c0f0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2c100 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2c110 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2c120 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  KPT, pData2);.  
2c130 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2c140 0a 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20  .      pData2 = 
2c150 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47  pData;.      PAG
2c160 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
2c170 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2c180 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2c190 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2c1a0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
2c1b0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2c1c0 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
2c1d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2c1e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c1f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c200 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2c210 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
2c220 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
2c230 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2c240 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
2c250 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2c260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c270 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
2c280 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
2c290 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2c2a0 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
2c2b0 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
2c2c0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
2c2d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2c2e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c2f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2c300 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2c310 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29  ired(PgHdr *pPg)
2c320 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75  {.  if( subjRequ
2c330 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2c340 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a  .    return subj
2c350 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2c360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2c370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c380 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2c390 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2c3a0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2c3b0 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2c3c0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2c3d0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2c3e0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2c3f0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2c400 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2c410 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2c420 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2c430 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2c440 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2c450 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2c460 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2c470 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2c480 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2c490 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2c4a0 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2c4b0 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2c4c0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2c4d0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2c4e0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2c4f0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2c500 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2c510 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2c520 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2c530 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2c540 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2c550 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2c560 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2c570 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2c580 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2c590 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2c5a0 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2c5b0 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2c5c0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2c5d0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2c5e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2c5f0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2c600 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2c610 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2c620 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2c630 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2c640 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2c650 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2c660 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2c670 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2c680 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c690 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2c6a0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2c6b0 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2c6c0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2c6d0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2c6e0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2c6f0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2c700 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2c710 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2c720 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2c730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2c740 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2c750 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2c760 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2c770 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2c780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c790 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2c7a0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2c7b0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2c7c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c7d0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2c7e0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2c7f0 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2c800 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2c810 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2c820 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2c830 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2c840 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2c850 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2c860 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2c870 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2c880 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2c890 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2c8a0 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2c8b0 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2c8c0 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2c8d0 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2c8e0 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2c8f0 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2c900 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2c910 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2c920 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2c930 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2c940 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2c950 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2c960 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2c970 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2c980 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2c990 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2c9a0 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2c9b0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2c9c0 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2c9d0 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2c9e0 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2c9f0 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2ca00 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2ca10 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2ca20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ca30 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2ca40 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2ca50 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2ca60 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2ca70 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a  h createFlag==3.
2ca80 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2ca90 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2caa0 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2cab0 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2cac0 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2cad0 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2cae0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2caf0 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2cb00 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2cb10 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2cb20 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2cb30 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2cb40 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2cb50 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2cb60 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2cb70 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2cb80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2cb90 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2cba0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2cbb0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2cbc0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2cbd0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2cbe0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2cbf0 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2cc00 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2cc10 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2cc20 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2cc30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2cc40 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2cc50 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2cc60 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2cc70 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2cc80 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2cc90 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2cca0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2ccb0 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2ccc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ccd0 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
2cce0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2ccf0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2cd00 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2cd10 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
2cd20 54 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  T.    /* If the 
2cd30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2cd40 20 22 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45   "BEGIN CONCURRE
2cd50 4e 54 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  NT" transaction,
2cd60 20 74 68 65 20 70 61 67 65 20 0a 20 20 20 20 2a   the page .    *
2cd70 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6c 75 73  * cannot be flus
2cd80 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 52 65 74  hed to disk. Ret
2cd90 75 72 6e 20 65 61 72 6c 79 20 69 6e 20 74 68 69  urn early in thi
2cda0 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 69  s case. */.    i
2cdb0 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  f( pPager->pAllR
2cdc0 65 61 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ead ) return SQL
2cdd0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
2cde0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
2cdf0 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
2ce00 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
2ce10 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
2ce20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2ce30 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b  IfRequired(pPg);
2ce40 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
2ce50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ce60 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
2ce70 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
2ce80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
2ce90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0a 23 69 66   }else{.    .#if
2cea0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2ceb0 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57  E_BATCH_ATOMIC_W
2cec0 52 49 54 45 0a 20 20 20 20 69 66 28 20 70 50 61  RITE.    if( pPa
2ced0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
2cee0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2cef0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2cf00 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
2cf10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2cf20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2cf30 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2cf40 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
2cf50 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20  }.#endif.  .    
2cf60 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2cf70 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2cf80 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2cf90 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2cfa0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2cfb0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2cfc0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2cfd0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2cfe0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2cff0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2d000 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2d010 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2d020 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2d030 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2d040 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2d050 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d070 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2d080 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2d090 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2d0a0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2d0b0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2d0c0 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2d0d0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2d0e0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2d0f0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2d100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2d110 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2d120 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2d130 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2d140 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2d150 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2d160 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2d170 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2d180 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2d190 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  r, rc); .}../*.*
2d1a0 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65  * Flush all unre
2d1b0 66 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70  ferenced dirty p
2d1c0 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  ages to disk..*/
2d1d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2d1e0 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50  rFlush(Pager *pP
2d1f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2d200 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2d210 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  e;.  if( !MEMDB 
2d220 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c  ){.    PgHdr *pL
2d230 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
2d240 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2d250 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2d260 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
2d270 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2d280 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69  ager) );.    whi
2d290 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2d2a0 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
2d2b0 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
2d2c0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2d2d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
2d2e0 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  t->nRef==0 ){.  
2d2f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2d300 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50  Stress((void*)pP
2d310 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ager, pList);.  
2d320 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73      }.      pLis
2d330 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  t = pNext;.    }
2d340 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2d350 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
2d360 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2d370 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
2d380 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
2d390 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
2d3a0 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
2d3b0 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
2d3c0 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
2d3d0 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
2d3e0 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
2d3f0 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
2d400 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
2d410 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2d420 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
2d430 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2d440 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
2d450 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
2d460 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
2d470 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2d480 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
2d490 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
2d4a0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
2d4b0 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
2d4c0 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
2d4d0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
2d4e0 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
2d4f0 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
2d500 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
2d510 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
2d520 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
2d530 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
2d540 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2d550 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
2d560 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
2d570 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
2d580 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2d590 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
2d5a0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
2d5b0 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
2d5c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2d5d0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
2d5e0 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
2d5f0 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
2d600 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
2d610 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2d620 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
2d630 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
2d640 74 45 78 74 72 61 28 29 20 41 50 49 2e 20 20 57  tExtra() API.  W
2d650 68 65 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69  hen a new page i
2d660 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  s allocated, the
2d670 0a 2a 2a 20 66 69 72 73 74 20 38 20 62 79 74 65  .** first 8 byte
2d680 73 20 6f 66 20 74 68 69 73 20 73 70 61 63 65 20  s of this space 
2d690 61 72 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74  are zeroed but t
2d6a0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20  he remainder is 
2d6b0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a  uninitialized..*
2d6c0 2a 20 28 54 68 65 20 65 78 74 72 61 20 73 70 61  * (The extra spa
2d6d0 63 65 20 69 73 20 75 73 65 64 20 62 79 20 62 74  ce is used by bt
2d6e0 72 65 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61  ree as the MemPa
2d6f0 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a  ge object.).**.*
2d700 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
2d710 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
2d720 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
2d730 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
2d740 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
2d750 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
2d760 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
2d770 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
2d780 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
2d790 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61   the PAGER_* fla
2d7a0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2d7b0 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2d7c0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2d7d0 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2d7e0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2d7f0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2d800 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2d810 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2d820 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2d830 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2d840 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2d850 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2d860 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2d870 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2d880 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2d890 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2d8a0 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2d8b0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2d8c0 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2d8d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2d8e0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2d8f0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2d900 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2d910 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2d920 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2d930 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2d940 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2d950 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2d960 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2d970 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2d980 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2d990 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2d9a0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2d9b0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2d9c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2d9d0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2d9e0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2d9f0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2da00 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2da10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2da20 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2da30 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2da40 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2da50 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2da60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2da70 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2da80 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2da90 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2daa0 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2dab0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2dac0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2dad0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2daf0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2db00 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2db10 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2db20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2db30 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2db40 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2db50 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2db60 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2db70 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2db80 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2db90 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2dba0 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2dbb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2dbc0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2dbd0 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2dbe0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2dbf0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2dc00 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2dc10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2dc20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2dc30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2dc40 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2dc50 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2dc60 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2dc70 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2dc80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2dc90 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2dca0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2dcb0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2dcc0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2dcd0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2dce0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2dcf0 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2dd00 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2dd10 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2dd20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2dd30 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2dd40 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2dd50 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2dd60 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2dd70 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2dd80 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2dd90 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2dda0 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2ddb0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2ddc0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2ddd0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2dde0 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2ddf0 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2de00 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
2de10 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
2de20 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
2de30 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2de40 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
2de50 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
2de60 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
2de70 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
2de80 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
2de90 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  size */.  const 
2dea0 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20  char *zUri = 0; 
2deb0 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74     /* URI args t
2dec0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
2ded0 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20  nUri = 0;       
2dee0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2def0 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61  f bytes of URI a
2df00 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a  rgs at *zUri */.
2df10 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
2df20 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
2df30 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
2df40 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
2df50 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
2df60 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
2df70 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
2df80 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
2df90 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f  ub-journal).  */
2dfa0 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  .  journalFileSi
2dfb0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2dfc0 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2dfd0 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Vfs));..  /* Set
2dfe0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2dff0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2e000 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2e010 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2e020 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2e030 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2e040 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2e050 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2e060 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2e070 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   1;.    if( zFil
2e080 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2e090 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  me[0] ){.      z
2e0a0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2e0b0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46  e3DbStrDup(0, zF
2e0c0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2e0d0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2e0e0 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54    ) return SQLIT
2e0f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2e100 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2e110 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e120 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2e130 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2e140 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2e150 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2e160 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2e170 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2e180 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2e190 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2e1a0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2e1b0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2e1c0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2e1d0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2e1e0 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2e1f0 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2e200 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2e210 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2e220 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2e230 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2e240 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2e250 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2e260 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2e270 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2e280 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2e290 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2e2a0 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2e2b0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2e2c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2e2d0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2e2e0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68  .    }.    zPath
2e2f0 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
2e300 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
2e310 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
2e320 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
2e330 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ls */.    rc = s
2e340 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
2e350 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2e360 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
2e370 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2e380 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2e390 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2e3a0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  thname);.    z =
2e3b0 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61   zUri = &zFilena
2e3c0 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
2e3d0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d  30(zFilename)+1]
2e3e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
2e3f0 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  ){.      z += sq
2e400 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2e410 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73  +1;.      z += s
2e420 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2e430 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  )+1;.    }.    n
2e440 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31  Uri = (int)(&z[1
2e450 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61  ] - zUri);.    a
2e460 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29  ssert( nUri>=0 )
2e470 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2e480 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
2e490 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
2e4a0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
2e4b0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2e4c0 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
2e4d0 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
2e4e0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2e4f0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2e500 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
2e510 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
2e520 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2e530 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2e540 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
2e550 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
2e560 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
2e570 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
2e580 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2e590 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
2e5a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e5b0 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
2e5c0 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
2e5d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
2e5e0 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
2e5f0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2e600 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2e610 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2e620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e630 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e640 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2e650 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2e660 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2e670 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2e680 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2e690 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2e6a0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2e6b0 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2e6c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2e6d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e6e0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2e6f0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2e700 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2e710 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2e720 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2e730 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2e740 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2e750 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2e760 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2e770 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2e780 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2e790 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2e7a0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2e7b0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2e7c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2e7d0 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2e7e0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2e7f0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2e800 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2e810 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2e820 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2e830 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2e840 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2e850 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2e860 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2e870 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2e880 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2e890 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2e8a0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2e8b0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2e8c0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2e8e0 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2e8f0 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2e900 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2e910 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2e920 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2e930 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2e940 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2e950 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2e960 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2e970 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2e980 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2e990 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2e9a0 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2e9b0 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2e9c0 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2e9d0 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2e9e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2e9f0 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2ea00 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2ea10 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20  me + 1 + nUri + 
2ea20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2ea30 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2ea40 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20  hname + 8 + 2   
2ea50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2ea60 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2ea70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2ea80 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2ea90 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20  e + 4 + 2       
2eaa0 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a       /* zWal */.
2eab0 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73  #endif.  );.  as
2eac0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2ead0 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
2eae0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
2eaf0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
2eb00 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
2eb10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2eb20 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2eb30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2eb40 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2eb50 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
2eb70 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
2eb80 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
2eb90 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
2eba0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
2ebb0 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
2ebc0 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
2ebd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2ebe0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2ebf0 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
2ec00 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
2ec10 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2ec20 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
2ec30 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
2ec40 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
2ec50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2ec60 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2ec70 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
2ec80 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
2ec90 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2eca0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2ecb0 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
2ecc0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2ecd0 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
2ece0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2ecf0 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
2ed00 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
2ed10 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
2ed20 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
2ed30 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
2ed40 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
2ed50 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a   nPathname>0 );.
2ed60 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
2ed70 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
2ed80 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
2ed90 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a  me + 1 + nUri);.
2eda0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2edb0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
2edc0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2edd0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72  me);.    if( nUr
2ede0 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67  i ) memcpy(&pPag
2edf0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2ee00 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2ee10 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  , nUri);.    mem
2ee20 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2ee30 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2ee40 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2ee50 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2ee60 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2ee70 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c  ame], "-journal\
2ee80 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20  000", 8+2);.    
2ee90 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2eea0 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2eeb0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  name, pPager->zJ
2eec0 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66  ournal);.#ifndef
2eed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2eee0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61  .    pPager->zWa
2eef0 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
2ef00 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
2ef10 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  8+1];.    memcpy
2ef20 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a  (pPager->zWal, z
2ef30 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2ef40 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2ef50 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e  (&pPager->zWal[n
2ef60 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c  Pathname], "-wal
2ef70 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20  \000", 4+1);.   
2ef80 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2ef90 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2efa0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2efb0 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Wal);.#endif.   
2efc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2efd0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2efe0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
2eff0 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
2f000 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
2f010 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
2f020 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
2f030 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
2f040 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2f050 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
2f060 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f080 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
2f090 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
2f0a0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2f0b0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2f0c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2f0d0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
2f0e0 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
2f0f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
2f100 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64  emDb );.    read
2f110 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2f120 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2f130 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
2f140 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2f150 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2f160 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2f170 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2f180 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2f190 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2f1a0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2f1b0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2f1c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2f1d0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2f1e0 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2f1f0 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2f200 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2f210 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2f220 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2f230 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2f240 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2f250 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2f260 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2f270 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2f280 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2f290 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2f2a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2f2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f2c0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
2f2d0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2f2e0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2f2f0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69  er->fd);.      i
2f300 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  f( !readOnly ){.
2f310 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f          setSecto
2f320 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2f330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2f340 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2f350 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
2f360 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f370 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69  SIZE);.        i
2f380 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2f390 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2f3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2f3b0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2f3c0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2f3d0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2f3e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2f3f0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2f400 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2f410 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2f420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f430 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2f440 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65  flt = (u32)pPage
2f450 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
2f460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f470 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2f480 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2f490 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
2f4a0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2f4b0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
2f4c0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2f4d0 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2f4e0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
2f4f0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2f500 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2f510 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2f520 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2f530 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2f540 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
2f550 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
2f560 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2f570 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2f580 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2f590 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2f5a0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
2f5b0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
2f5c0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
2f5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f5e0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
2f5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f600 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f610 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2f620 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2f630 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  ->noLock = sqlit
2f640 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2f650 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63  Filename, "noloc
2f660 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  k", 0);.      if
2f670 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ( (iDc & SQLITE_
2f680 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29  IOCAP_IMMUTABLE)
2f690 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  !=0.       || sq
2f6a0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2f6b0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d  n(zFilename, "im
2f6c0 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a  mutable", 0) ){.
2f6d0 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61            vfsFla
2f6e0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2f6f0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
2f700 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c        goto act_l
2f710 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20  ike_temp_file;. 
2f720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2f730 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2f740 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2f750 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
2f760 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
2f770 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2f780 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2f790 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
2f7a0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2f7b0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
2f7c0 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
2f7d0 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
2f7e0 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
2f7f0 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
2f800 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2f810 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
2f820 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
2f830 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
2f840 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
2f850 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2f860 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
2f870 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
2f880 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
2f890 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
2f8a0 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
2f8b0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
2f8c0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a  journal..    **.
2f8d0 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2f8e0 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72  ch also runs for
2f8f0 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73   files marked as
2f900 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20   immutable..    
2f910 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  */ .act_like_tem
2f920 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70  p_file:.    temp
2f930 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2f940 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2f950 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20  AGER_READER;    
2f960 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2f970 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
2f980 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  ck */.    pPager
2f990 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53  ->eLock = EXCLUS
2f9a0 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20  IVE_LOCK;    /* 
2f9b0 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69  Pretend we are i
2f9c0 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65  n EXCLUSIVE mode
2f9d0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2f9e0 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20  noLock = 1;     
2f9f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2fa00 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20   no locking */. 
2fa10 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
2fa20 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
2fa30 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2fa40 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
2fa50 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
2fa60 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2fa70 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
2fa80 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
2fa90 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
2faa0 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
2fab0 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
2fac0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2fad0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2fae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2faf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
2fb00 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
2fb10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2fb20 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
2fb30 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
2fb40 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
2fb50 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
2fb60 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   );.  }..  /* In
2fb70 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
2fb80 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
2fb90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fba0 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61  OK ){.    nExtra
2fbb0 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2fbc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2fbd0 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74  Extra>=8 && nExt
2fbe0 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72  ra<1000 );.    r
2fbf0 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
2fc00 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
2fc10 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
2fc20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fc30 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2fc40 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2fc50 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2fc60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2fc70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2fc80 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2fc90 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2fca0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2fcb0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2fcc0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2fcd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fce0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2fcf0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2fd00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2fd10 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
2fd20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c  pSpace);.    sql
2fd30 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2fd40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2fd50 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2fd60 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2fd70 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2fd80 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2fd90 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2fda0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2fdb0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2fdc0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2fdd0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2fde0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2fdf0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2fe00 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2fe10 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2fe20 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2fe30 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2fe40 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2fe50 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2fe60 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2fe70 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2fe80 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2fe90 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2fea0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2feb0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2fec0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2fed0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2fee0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2fef0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2ff00 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2ff10 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2ff20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ff30 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2ff40 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2ff50 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2ff60 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2ff70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2ff80 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2ff90 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2ffa0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2ffb0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ffc0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2ffd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2ffe0 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2fff0 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
30000 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
30010 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
30020 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
30030 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
30040 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
30050 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
30060 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
30070 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
30080 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
30090 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
300a0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
300b0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
300c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
300d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
300e0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
300f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
30100 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
30110 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
30120 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
30130 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
30140 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30150 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
30160 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
30170 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
30180 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
30190 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30  r->extraSync = 0
301a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
301b0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
301c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
301d0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
301e0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
301f0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53  SYNC_NORMAL | (S
30200 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
30210 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  L<<2);.  }.  /* 
30220 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
30230 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
30240 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
30250 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
30260 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
30270 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
30280 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
30290 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
302a0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
302b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
302c0 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
302d0 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
302e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
302f0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
30300 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
30310 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
30320 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
30330 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
30340 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
30350 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
30360 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
30370 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
30380 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
30390 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
303a0 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
303b0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
303c0 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
303d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
303e0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
303f0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
30400 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
30410 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d 65 74  ;.  setGetterMet
30420 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  hod(pPager);.  /
30430 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
30440 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
30450 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
30460 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  ); */.  /* pPage
30470 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49  r->szMmap = SQLI
30480 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
30490 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20  SIZE // will be 
304a0 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a  set by btree.c *
304b0 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
304c0 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
304d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
304e0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
304f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30500 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
30510 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
30520 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
30530 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
30540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
30550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
30560 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f   still were it o
30570 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e  ught.** to be on
30580 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e   disk.  Return n
30590 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f  on-zero (SQLITE_
305a0 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
305b0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
305c0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f  rror.** code fro
305d0 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  m sqlite3OsAcces
305e0 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61  s()) if the data
305f0 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69  base has gone mi
30600 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
30610 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55   int databaseIsU
30620 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50  nmoved(Pager *pP
30630 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61  ager){.  int bHa
30640 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e  sMoved = 0;.  in
30650 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
30660 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20  ger->tempFile ) 
30670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30680 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
30690 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75  dbSize==0 ) retu
306a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
306b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
306c0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61  zFilename && pPa
306d0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
306e0 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ] );.  rc = sqli
306f0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
30700 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
30710 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
30720 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29  VED, &bHasMoved)
30730 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
30740 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
30750 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53     /* If the HAS
30760 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74  _MOVED file-cont
30770 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65  rol is unimpleme
30780 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  nted, assume tha
30790 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  t the file.    *
307a0 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  * has not been m
307b0 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74  oved.  That is t
307c0 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65  he historical be
307d0 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65  havior of SQLite
307e0 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a  : prior to.    *
307f0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c  * version 3.8.3,
30800 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65   it never checke
30810 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  d */.    rc = SQ
30820 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
30830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30840 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20  OK && bHasMoved 
30850 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
30860 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
30870 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VED;.  }.  retur
30880 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
30890 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
308a0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
308b0 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
308c0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
308d0 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
308e0 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
308f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
30900 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
30910 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
30920 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
30930 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
30940 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
30950 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
30960 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
30970 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
30980 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
30990 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
309a0 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
309b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
309c0 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
309d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
309e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
309f0 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
30a00 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
30a10 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
30a20 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
30a30 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
30a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30a50 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
30a60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30a70 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
30a80 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
30a90 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
30aa0 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
30ab0 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
30ac0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
30ad0 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
30ae0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
30af0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
30b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
30b10 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
30b20 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
30b30 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
30b40 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
30b50 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
30b60 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
30b70 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
30b80 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
30b90 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
30ba0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
30bb0 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
30bc0 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
30bd0 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
30be0 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
30bf0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
30c00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
30c10 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
30c20 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
30c30 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
30c40 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
30c50 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
30c60 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
30c70 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
30c80 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
30c90 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
30ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30cb0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
30cc0 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
30cd0 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
30ce0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
30cf0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
30d00 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
30d10 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
30d20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
30d30 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
30d40 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
30d50 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
30d60 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
30d70 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
30d80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
30d90 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
30da0 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
30db0 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
30dc0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
30dd0 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
30de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30df0 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
30e00 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
30e10 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
30e20 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
30e30 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
30e40 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
30e50 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
30e60 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
30e70 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
30e80 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
30e90 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
30ea0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
30eb0 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
30ec0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
30ed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
30ee0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
30ef0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
30f00 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
30f10 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
30f20 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
30f30 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
30f40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
30f50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30f60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73  de */.  int exis
30f70 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ts = 1;         
30f80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
30f90 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
30fa0 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
30fb0 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21  int jrnlOpen = !
30fc0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
30fd0 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  jfd);..  assert(
30fe0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
30ff0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
31000 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
31010 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
31020 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31030 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a  =PAGER_OPEN );..
31040 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70    assert( jrnlOp
31050 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74  en==0 || ( sqlit
31060 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
31070 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
31080 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c  ->jfd) &.    SQL
31090 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
310a0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a  TABLE_WHEN_OPEN.
310b0 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74    ));..  *pExist
310c0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72  s = 0;.  if( !jr
310d0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  nlOpen ){.    rc
310e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
310f0 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
31100 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
31110 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
31120 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20   &exists);.  }. 
31130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31140 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
31150 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d      int locked =
31160 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31170 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
31180 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
31190 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
311a0 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
311b0 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
311c0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
311d0 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
311e0 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
311f0 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
31200 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
31210 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
31220 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
31230 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
31240 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
31250 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
31260 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
31270 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
31280 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
31290 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
312a0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
312b0 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
312c0 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
312d0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
312e0 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
312f0 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
31300 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
31310 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
31320 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
31330 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
31340 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
31350 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
31360 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
31370 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
31380 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
31390 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
313a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
313b0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
313c0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
313d0 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
313e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
313f0 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
31400 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31420 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
31430 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
31440 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  file */..      a
31450 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
31460 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20  empFile==0 );.  
31470 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
31480 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
31490 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
314a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
314b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
314c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
314d0 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20  s zero pages in 
314e0 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  size, that means
314f0 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29   that either (1)
31500 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
31510 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d  journal is a rem
31520 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f  nant from a prio
31530 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  r database with 
31540 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68  the same name wh
31550 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ere.        ** t
31560 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31570 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75   but not the jou
31580 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64  rnal was deleted
31590 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69  , or (2) the ini
315a0 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  tial.        ** 
315b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
315c0 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77   populates a new
315d0 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69   database is bei
315e0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ng rolled back..
315f0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69          ** In ei
31600 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a  ther case, the j
31610 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20  ournal file can 
31620 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77  be deleted.  How
31630 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a  ever, take care.
31640 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74          ** not t
31650 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
31660 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
31670 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
31680 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  due to.        *
31690 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  * journal_mode=P
316a0 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20  ERSIST..        
316b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  */.        if( n
316c0 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c  Page==0 && !jrnl
316d0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
316e0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
316f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
31700 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
31710 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
31720 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
31730 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31750 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
31760 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31770 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
31780 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
31790 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
317a0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
317b0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
317c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
317d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
317e0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
317f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
31800 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
31810 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
31820 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
31830 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
31840 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
31850 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
31860 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
31870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31880 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
31890 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
318a0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
318b0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
318c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
318d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
318e0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
318f0 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
31900 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
31910 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
31920 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
31930 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
31940 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
31950 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
31960 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
31970 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
31980 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
31990 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
319a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
319b0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
319c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
319d0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
319e0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
319f0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
31a00 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
31a10 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
31a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
31a40 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
31a50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31a60 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
31a70 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
31a80 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
31a90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31aa0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
31ab0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
31ac0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
31ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31af0 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
31b00 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
31b10 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
31b20 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
31b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
31b40 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
31b50 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
31b60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
31b70 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
31b80 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
31b90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
31ba0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
31bb0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
31bc0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
31bd0 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
31be0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
31bf0 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
31c00 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
31c10 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
31c20 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
31c30 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
31c40 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
31c50 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
31c60 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
31c70 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
31c80 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
31c90 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
31ca0 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
31cb0 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
31cc0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
31cd0 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
31ce0 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
31cf0 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
31d00 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
31d10 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
31d20 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
31d30 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
31d40 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
31d50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
31d60 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
31d70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
31d80 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
31d90 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
31da0 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
31db0 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
31dc0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
31dd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
31de0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
31df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31e00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
31e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31e20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
31e30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
31e40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
31e50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
31e60 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
31e70 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
31e80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31e90 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
31ea0 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
31eb0 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74  e3PagerGet() unt
31ec0 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
31ed0 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
31ee0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
31ef0 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
31f00 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
31f10 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
31f20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31f30 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
31f40 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
31f50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
31f60 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
31f70 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
31f80 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
31f90 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
31fa0 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
31fb0 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  y in PAGER_OPEN 
31fc0 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
31fd0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
31fe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31ff0 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
32000 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
32010 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
32020 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
32030 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32040 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
32050 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
32060 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
32070 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
32080 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
32090 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
320a0 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
320b0 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
320c0 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
320d0 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
320e0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
320f0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
32100 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
32110 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
32120 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
32130 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
32140 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
32150 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
32160 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
32170 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
32180 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
32190 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
321a0 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
321b0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
321c0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
321d0 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
321e0 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
321f0 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
32200 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
32210 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
32220 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
32230 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
32240 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
32250 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
32260 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
32270 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
32280 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
32290 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
322a0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
322b0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
322c0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
322d0 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
322e0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
322f0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
32300 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
32310 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
32320 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
32330 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
32340 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
32350 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
32360 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a  urnal file or .*
32370 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  * rolling back a
32380 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
32390 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
323a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
323b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
323c0 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
323d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
323e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
323f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32400 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
32410 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
32420 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
32430 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
32440 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
32450 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
32460 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
32470 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73  es. This implies
32480 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
32490 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74  state should eit
324a0 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e  her.  ** be OPEN
324b0 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44   or READER. READ
324c0 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ER is only possi
324d0 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72  ble if the pager
324e0 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20   is or was in . 
324f0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
32500 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20  cess mode.  */. 
32510 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32520 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32530 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
32540 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
32550 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
32560 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
32570 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32580 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32590 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
325a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
325b0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
325c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
325d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
325e0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
325f0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
32600 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32610 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
32620 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
32630 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
32640 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
32650 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
32660 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
32670 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
32680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
32690 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
326a0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
326b0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
326c0 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  CK );..    rc = 
326d0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
326e0 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
326f0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
32700 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32710 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32720 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
32730 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
32740 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
32750 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67  _LOCK );.      g
32760 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
32770 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  }..    /* If a j
32780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
32790 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
327a0 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
327b0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
327c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
327d0 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
327e0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
327f0 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
32800 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32810 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d   pPager->eLock<=
32820 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
32830 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
32840 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
32850 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  &bHotJournal);. 
32860 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
32870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32880 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32890 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
328a0 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
328b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
328c0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
328d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
328e0 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
328f0 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  K;.        goto 
32900 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
32910 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
32920 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
32930 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
32940 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
32950 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
32960 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
32970 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
32980 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
32990 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
329a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
329b0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
329c0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
329d0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
329e0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
329f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
32a00 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
32a10 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
32a20 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
32a30 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
32a40 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
32a50 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
32a60 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
32a70 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
32a80 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
32a90 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
32aa0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
32ab0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
32ac0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
32ad0 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
32ae0 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
32af0 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
32b00 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
32b10 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
32b20 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
32b30 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
32b40 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
32b50 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
32b60 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
32b70 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
32b80 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
32b90 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
32ba0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
32bb0 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
32bc0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
32bd0 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
32be0 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
32bf0 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
32c00 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
32c10 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
32c20 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
32c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
32c40 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
32c50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
32c60 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
32c70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32c80 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
32c90 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
32ca0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
32cb0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
32cc0 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
32cd0 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
32ce0 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
32cf0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
32d00 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
32d10 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
32d20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
32d30 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
32d40 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
32d50 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
32d60 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
32d70 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
32d80 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
32d90 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
32da0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
32db0 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
32dc0 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
32dd0 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
32de0 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
32df0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
32e00 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
32e10 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
32e20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
32e30 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
32e40 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
32e50 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
32e60 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
32e70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
32e80 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
32e90 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
32ea0 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
32eb0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
32ec0 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
32ed0 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
32ee0 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
32ef0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
32f00 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
32f10 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
32f20 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
32f30 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
32f40 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
32f50 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
32f60 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
32f70 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
32f80 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
32f90 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
32fa0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
32fb0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
32fc0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
32fd0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32ff0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
33000 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
33010 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
33020 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
33030 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
33040 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
33050 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
33060 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
33070 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
33080 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
33090 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
330a0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
330b0 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
330c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
330d0 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
330e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
330f0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
33100 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
33110 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
33120 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
33130 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
33140 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
33150 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
33160 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33170 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
33180 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
33190 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
331a0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
331b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
331c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
331d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
331e0 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
331f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33200 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
33210 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
33220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33230 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
33240 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
33250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
33260 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
33270 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
33280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33290 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
332a0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
332b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
332c0 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
332d0 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
332e0 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
332f0 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
33300 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
33310 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
33320 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
33330 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
33340 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
33350 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
33360 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
33370 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
33380 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
33390 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
333a0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
333b0 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
333c0 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
333d0 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
333e0 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
333f0 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
33400 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
33410 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
33420 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
33430 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
33440 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
33450 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
33460 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
33470 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
33480 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
33490 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
334a0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
334b0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
334c0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
334d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
334e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
334f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
33500 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
33510 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  er, !pPager->tem
33520 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
33530 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
33540 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
33550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33560 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
33570 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
33580 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
33590 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
335a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
335b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
335c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
335d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
335e0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
335f0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
33600 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
33610 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
33620 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
33630 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
33640 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
33650 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
33660 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
33670 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
33680 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
33690 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
336a0 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
336b0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
336c0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
336d0 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
336e0 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
336f0 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
33700 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
33710 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
33720 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
33730 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
33740 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
33750 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
33760 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
33770 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
33780 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
33790 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
337a0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
337b0 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
337c0 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
337d0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
337e0 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
337f0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
33800 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
33810 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
33820 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
33830 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
33840 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
33850 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
33860 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
33870 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
33880 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
33890 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
338a0 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
338b0 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
338c0 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
338d0 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
338e0 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
338f0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
33900 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
33910 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
33920 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
33930 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
33940 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
33950 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
33960 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
33970 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
33980 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
33990 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
339a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
339b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
339c0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
339d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
339e0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
339f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33a00 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
33a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
33a20 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
33a30 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
33a40 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
33a50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
33a60 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
33a70 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
33a80 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
33a90 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
33aa0 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65  empFile && pPage
33ab0 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
33ac0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
33ad0 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
33ae0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
33af0 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65  cquired then che
33b00 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ck to.      ** s
33b10 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
33b20 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
33b30 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
33b40 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
33b50 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75  ed,.      ** flu
33b60 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
33b70 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64  he hasHeldShared
33b80 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e  Lock flag preven
33b90 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  ts this from.   
33ba0 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20     ** occurring 
33bb0 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73  on the very firs
33bc0 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69  t access to a fi
33bd0 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  le, in order to 
33be0 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
33bf0 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61  single unnecessa
33c00 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  ry sqlite3OsRead
33c10 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73  () call at the s
33c20 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a  tart-up..      *
33c30 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
33c40 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  ase changes are 
33c50 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
33c60 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
33c70 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
33c80 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
33c90 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
33ca0 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
33cb0 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
33cc0 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
33cd0 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
33ce0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
33cf0 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
33d00 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
33d10 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
33d20 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
33d30 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
33d40 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
33d50 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
33d60 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
33d70 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
33d80 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
33d90 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
33da0 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
33db0 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
33dc0 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
33dd0 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
33de0 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
33df0 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
33e00 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
33e10 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
33e20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64   */.      char d
33e30 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
33e40 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
33e50 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f  ers)];..      IO
33e60 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
33e70 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
33e80 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
33e90 72 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20  rs)));.      rc 
33ea0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
33eb0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
33ec0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
33ed0 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
33ee0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33f00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33f10 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
33f20 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
33f30 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
33f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33f50 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
33f60 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
33f70 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
33f80 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
33f90 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
33fa0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
33fb0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
33fc0 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
33fd0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
33fe0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
33ff0 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74        /* Unmap t
34000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34010 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
34020 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70   that external p
34030 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20  rocesses.       
34040 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75   ** may have tru
34050 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62  ncated the datab
34060 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
34070 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61  n extended it ba
34080 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ck.        ** to
34090 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
340a0 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ze while this pr
340b0 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f  ocess was not ho
340c0 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20  lding a lock..  
340d0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
340e0 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20   case there may 
340f0 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d  exist a Pager.pM
34100 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ap mapping that 
34110 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20  appears.        
34120 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67  ** to be the rig
34130 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e  ht size but is n
34140 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69  ot actually vali
34150 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20  d. Avoid this.  
34160 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69        ** possibi
34170 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e  lity by unmappin
34180 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a  g the db here. *
34190 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53  /.        if( US
341a0 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
341b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
341c0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
341d0 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
341e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
341f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
34200 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41  If there is a WA
34210 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  L file in the fi
34220 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20  le-system, open 
34230 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e  this database in
34240 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65   WAL.    ** mode
34250 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
34260 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
34270 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  ion call is a no
34280 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  -op..    */.    
34290 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61  rc = pagerOpenWa
342a0 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65  lIfPresent(pPage
342b0 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
342c0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
342d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
342e0 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  pWal==0 || rc==S
342f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64  QLITE_OK );.#end
34300 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  if.  }..  if( pa
34310 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34320 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
34330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34340 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
34350 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
34360 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
34370 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
34380 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20  >tempFile==0 && 
34390 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
343a0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
343b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
343c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
343d0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
343e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
343f0 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
34400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34410 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
34420 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
34430 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
34440 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
34450 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
34460 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
34470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
34480 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
34490 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  GER_READER;.    
344a0 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
344b0 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20  haredLock = 1;. 
344c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
344d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
344e0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
344f0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
34500 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
34510 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
34520 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
34530 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
34540 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
34550 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
34560 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
34570 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
34580 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
34590 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
345a0 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
345b0 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
345c0 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
345d0 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
345e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
345f0 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
34600 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
34610 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
34620 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73  pPager){.  if( s
34630 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
34640 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
34650 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ache)==0 ){.    
34660 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34670 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f  nMmapOut==0 ); /
34680 2a 20 62 65 63 61 75 73 65 20 70 61 67 65 31 20  * because page1 
34690 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
346a0 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61  mapped */.    pa
346b0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
346c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
346d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
346e0 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f  age getter metho
346f0 64 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61  ds each try to a
34700 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
34710 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20  ce to a.** page 
34720 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
34730 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65   pgno. If the re
34740 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
34750 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
34760 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
34770 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
34780 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
34790 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
347a0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
347b0 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d  different implem
347c0 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
347d0 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64   getter method d
347e0 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74  epending.** on t
347f0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
34800 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   of the pager..*
34810 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  *.**     getPage
34820 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20  Normal()        
34830 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20   --  The normal 
34840 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65  getter.**     ge
34850 74 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20  tPageError()    
34860 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69        --  Used i
34870 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
34880 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
34890 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d  .**     getPageM
348a0 6d 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20  map()           
348b0 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f  --  Used if memo
348c0 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
348d0 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49   enabled.**.** I
348e0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
348f0 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
34900 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
34910 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
34920 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
34930 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
34940 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
34950 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
34960 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
34970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34980 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
34990 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
349a0 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
349b0 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
349c0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
349d0 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
349e0 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
349f0 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
34a00 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
34a10 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
34a20 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
34a30 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
34a40 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
34a50 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
34a60 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
34a70 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
34a80 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
34a90 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
34aa0 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
34ab0 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
34ac0 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
34ad0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
34ae0 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
34af0 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
34b00 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
34b10 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
34b20 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
34b30 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
34b40 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
34b50 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
34b60 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
34b70 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73  if .** the flags
34b80 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
34b90 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45  ins the PAGER_GE
34ba0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20  T_NOCONTENT bit 
34bb0 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
34bc0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
34bd0 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
34be0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
34bf0 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
34c00 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
34c10 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
34c20 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
34c30 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
34c40 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
34c50 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
34c60 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47  **.** If PAGER_G
34c70 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20  ET_NOCONTENT is 
34c80 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
34c90 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
34ca0 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
34cb0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
34cc0 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
34cd0 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  s in two scenari
34ce0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
34cf0 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
34d00 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
34d10 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
34d20 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
34d30 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
34d40 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
34d50 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
34d60 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
34d70 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
34d80 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
34d90 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
34da0 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
34db0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
34dc0 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
34dd0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47  al..**.** If PAG
34de0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34df0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
34e00 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
34e10 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
34e20 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72  ad.** of being r
34e30 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
34e40 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
34e50 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
34e60 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
34e70 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
34e80 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
34e90 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
34ea0 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
34eb0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
34ec0 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
34ed0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
34ee0 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
34ef0 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
34f00 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
34f10 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
34f20 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
34f30 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
34f40 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
34f50 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
34f60 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
34f70 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
34f80 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
34f90 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
34fa0 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
34fb0 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
34fc0 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
34fd0 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
34fe0 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
34ff0 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
35000 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
35010 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
35020 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
35030 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
35040 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
35050 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
35060 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
35070 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
35080 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
35090 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
350a0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
350b0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
350c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
350d0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
350e0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
350f0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
35100 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
35110 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
35120 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
35130 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
35140 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
35150 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
35160 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
35170 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
35180 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
35190 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
351a0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
351b0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
351c0 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
351d0 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
351e0 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
351f0 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
35200 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
35210 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
35220 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65  geNormal(.  Page
35230 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
35240 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
35250 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
35260 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
35270 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
35280 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
35290 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
352a0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
352b0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
352c0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
352d0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
352e0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
352f0 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
35300 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
35310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35320 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
35330 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20   u8 noContent;  
35340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35350 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45   /* True if PAGE
35360 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
35370 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69  is set */.  sqli
35380 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
35390 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72  *pBase;..  asser
353a0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
353b0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
353c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
353d0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
353e0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
353f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
35400 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35420 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
35430 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 23 69  edLock==1 );..#i
35440 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35450 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f  T_CONCURRENT.  /
35460 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
35470 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
35480 61 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 70  action and the p
35490 61 67 65 20 62 65 69 6e 67 20 72 65 61 64 20 77  age being read w
354a0 61 73 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  as.  ** present 
354b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
354c0 66 69 6c 65 20 77 68 65 6e 20 74 68 65 20 74 72  file when the tr
354d0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
354e0 65 6e 65 64 2c 0a 20 20 2a 2a 20 6d 61 72 6b 20  ened,.  ** mark 
354f0 69 74 20 61 73 20 72 65 61 64 20 69 6e 20 74 68  it as read in th
35500 65 20 70 41 6c 6c 52 65 61 64 20 76 65 63 74 6f  e pAllRead vecto
35510 72 2e 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 30  r.  */.  pPg = 0
35520 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
35530 70 41 6c 6c 52 65 61 64 20 26 26 20 70 67 6e 6f  pAllRead && pgno
35540 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
35550 53 69 7a 65 20 29 7b 0a 20 20 20 20 50 41 47 45  Size ){.    PAGE
35560 52 54 52 41 43 45 28 28 22 55 53 49 4e 47 20 70  RTRACE(("USING p
35570 61 67 65 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29  age %d\n", pgno)
35580 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
35590 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
355a0 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 2c 20 70  ger->pAllRead, p
355b0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
355c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
355d0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
355e0 5f 65 72 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _err;.  }.#endif
355f0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
35600 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
35610 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
35620 70 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50  pBase = sqlite3P
35630 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
35640 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
35650 2c 20 33 29 3b 0a 20 20 69 66 28 20 70 42 61 73  , 3);.  if( pBas
35660 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 67 20  e==0 ){.    pPg 
35670 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
35680 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35690 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Stress(pPager->p
356a0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70  PCache, pgno, &p
356b0 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Base);.    if( r
356c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
356d0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
356e0 65 5f 65 72 72 3b 0a 20 20 20 20 69 66 28 20 70  e_err;.    if( p
356f0 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Base==0 ){.     
35700 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
35710 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
35720 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
35730 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_err;.    }.  }
35740 0a 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65  .  pPg = *ppPage
35750 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35760 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67  FetchFinish(pPag
35770 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
35780 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 61 73 73  o, pBase);.  ass
35790 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61  ert( pPg==(*ppPa
357a0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
357b0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f   pPg->pgno==pgno
357c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
357d0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
357e0 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  r || pPg->pPager
357f0 3d 3d 30 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74  ==0 );..  noCont
35800 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ent = (flags & P
35810 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
35820 4e 54 29 21 3d 30 3b 0a 20 20 69 66 28 20 70 50  NT)!=0;.  if( pP
35830 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  g->pPager && !no
35840 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
35850 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
35860 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
35870 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
35880 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
35890 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
358a0 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
358b0 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
358c0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
358d0 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
358e0 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
358f0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
35900 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
35910 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
35920 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72  AT_HIT]++;.    r
35930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35940 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
35950 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
35960 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
35970 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
35980 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
35990 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
359a0 6c 69 7a 65 64 2e 20 42 75 74 20 66 69 72 73 74  lized. But first
359b0 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 68 65 63   some error chec
359c0 6b 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ks:.    **.    *
359d0 2a 20 28 31 29 20 54 68 65 20 6d 61 78 69 6d 75  * (1) The maximu
359e0 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
359f0 20 32 5e 33 31 0a 20 20 20 20 2a 2a 20 28 32 29   2^31.    ** (2)
35a00 20 4e 65 76 65 72 20 74 72 79 20 74 6f 20 66 65   Never try to fe
35a10 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
35a20 70 61 67 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  page.    */.    
35a30 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
35a40 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
35a50 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
35a60 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35a70 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
35a80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
35a90 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35aa0 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
35ab0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
35ac0 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 61 73   pPager;..    as
35ad0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
35ae0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45  ager->fd) || !ME
35af0 4d 44 42 20 29 3b 0a 20 20 20 20 69 66 28 20 21  MDB );.    if( !
35b00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
35b10 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  d) || pPager->db
35b20 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43  Size<pgno || noC
35b30 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
35b40 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
35b50 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
35b60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
35b70 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
35b80 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
35b90 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
35ba0 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
35bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
35bc0 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
35bd0 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
35be0 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
35bf0 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
35c00 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
35c10 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
35c20 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
35c30 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
35c40 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
35c50 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
35c60 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
35c70 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
35c80 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
35c90 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
35ca0 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
35cb0 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
35cc0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
35cd0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
35ce0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
35cf0 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
35d00 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
35d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
35d20 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
35d30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
35d40 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
35d50 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
35d60 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
35d70 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
35d80 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
35d90 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
35da0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
35db0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
35dc0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
35dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
35de0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
35df0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
35e00 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
35e10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
35e20 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
35e30 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
35e40 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
35e50 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
35e60 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
35e70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
35e80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
35e90 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
35ea0 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
35eb0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
35ec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35ed0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
35ee0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
35ef0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
35f00 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d  tat[PAGER_STAT_M
35f10 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63  ISS]++;.      rc
35f20 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
35f30 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
35f40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35f50 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
35f60 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35f80 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
35f90 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ash(pPg);.  }.  
35fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35fb0 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
35fc0 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
35fd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
35fe0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
35ff0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
36000 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
36010 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
36020 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2a  sed(pPager);.  *
36030 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
36040 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
36050 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
36060 53 49 5a 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61  SIZE>0./* The pa
36070 67 65 20 67 65 74 74 65 72 20 66 6f 72 20 77 68  ge getter for wh
36080 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  en memory-mapped
36090 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 20   I/O is enabled 
360a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
360b0 74 50 61 67 65 4d 4d 61 70 28 0a 20 20 50 61 67  tPageMMap(.  Pag
360c0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
360d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
360e0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
360f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
36100 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
36110 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36120 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
36130 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
36140 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
36150 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
36160 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
36170 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
36180 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
36190 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
361a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
361b0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ;.  PgHdr *pPg =
361c0 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65   0;.  u32 iFrame
361d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
361e0 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74        /* Frame t
361f0 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20  o read from WAL 
36200 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74  file */..  /* It
36210 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
36220 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
36230 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
36240 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
36250 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
36260 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
36270 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
36280 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
36290 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
362a0 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
362b0 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
362c0 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
362d0 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
362e0 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
362f0 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
36300 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
36310 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
36320 20 3d 20 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26   = (pgno>1.   &&
36330 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
36340 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
36350 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
36360 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  _GET_READONLY)).
36370 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
36380 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
36390 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
363a0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 61 73  E_HAS_CODEC.  as
363b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 78 43  sert( pPager->xC
363c0 6f 64 65 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  odec==0 );.#endi
363d0 66 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61  f..  /* Optimiza
363e0 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69  tion note:  Addi
363f0 6e 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22  ng the "pgno<=1"
36400 20 74 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67   term before "pg
36410 6e 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a  no==0" here.  **
36420 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70   allows the comp
36430 69 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74  iler optimizer t
36440 6f 20 72 65 75 73 65 20 74 68 65 20 72 65 73 75  o reuse the resu
36450 6c 74 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f  lts of the "pgno
36460 3e 31 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e  >1".  ** test in
36470 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74   the previous st
36480 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f  atement, and avo
36490 69 64 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d  id testing pgno=
364a0 3d 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63  =0 in the.  ** c
364b0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
364c0 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20   pgno is large. 
364d0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31  */.  if( pgno<=1
364e0 20 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20   && pgno==0 ){. 
364f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36500 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
36510 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
36520 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
36530 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
36540 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
36550 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
36560 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36570 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
36580 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  aredLock==1 );. 
36590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
365a0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
365b0 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d  _OK );..  if( bM
365c0 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73  mapOk && pagerUs
365d0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
365e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
365f0 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
36600 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
36610 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69   &iFrame);.    i
36620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36630 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67   ){.      *ppPag
36640 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
36650 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
36660 7d 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20  }.  if( bMmapOk 
36670 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a  && iFrame==0 ){.
36680 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
36690 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
366a0 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61  lite3OsFetch(pPa
366b0 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20  ger->fd, .      
366c0 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20    (i64)(pgno-1) 
366d0 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
366e0 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ze, pPager->page
366f0 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20  Size, &pData.   
36700 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
36710 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
36720 74 61 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ta ){.      if( 
36730 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
36740 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 70  AGER_READER || p
36750 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
36760 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d  ){.        pPg =
36770 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
36780 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
36790 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
367a0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
367b0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
367c0 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
367d0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44  pPager, pgno, pD
367e0 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ata, &pPg);.    
367f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36800 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
36810 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
36820 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
36830 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
36840 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
36850 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
36860 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
36870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
36880 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
36890 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65   pPg;.        re
368a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
368b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
368c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
368d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  _OK ){.      *pp
368e0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
368f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36900 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65  .  }.  return ge
36910 74 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67  tPageNormal(pPag
36920 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
36930 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64  , flags);.}.#end
36940 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
36950 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
36960 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  ./* The page get
36970 74 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77  ter method for w
36980 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
36990 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
369a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
369b0 74 50 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61  tPageError(.  Pa
369c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
369d0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
369e0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
369f0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
36a00 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
36a10 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36a20 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
36a30 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
36a40 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
36a50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
36a60 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
36a70 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
36a80 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
36a90 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55   flags */.){.  U
36aa0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36ab0 70 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pgno);.  UNUSED_
36ac0 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
36ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36ae0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
36af0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50  ITE_OK );.  *ppP
36b00 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
36b10 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
36b20 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74  e;.}.../* Dispat
36b30 63 68 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63  ch all page fetc
36b40 68 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68  h requests to th
36b50 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 67 65  e appropriate ge
36b60 74 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  tter method..*/.
36b70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
36b80 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Get(.  Pager *pP
36b90 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
36ba0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
36bb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36bc0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
36bd0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
36be0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
36bf0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
36c00 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
36c10 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
36c20 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
36c30 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
36c40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
36c50 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
36c60 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  */.){.  return p
36c70 50 61 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67  Pager->xGet(pPag
36c80 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
36c90 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
36ca0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
36cb0 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
36cc0 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
36cd0 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
36ce0 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
36cf0 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
36d00 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
36d10 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
36d20 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
36d30 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
36d40 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
36d50 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
36d60 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
36d70 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
36d80 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
36d90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
36da0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
36db0 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
36dc0 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
36dd0 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
36de0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
36df0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
36e00 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
36e10 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
36e20 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
36e30 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
36e40 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
36e50 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
36e60 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
36e70 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
36e80 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
36e90 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
36ea0 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70  no){.  sqlite3_p
36eb0 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67  cache_page *pPag
36ec0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
36ed0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
36ee0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
36ef0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36f00 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
36f10 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   pPage = sqlite3
36f20 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
36f30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
36f40 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
36f50 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61   pPage==0 || pPa
36f60 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
36f70 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20  edLock );.  if( 
36f80 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  pPage==0 ) retur
36f90 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  n 0;.  return sq
36fa0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
36fb0 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
36fc0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50  PCache, pgno, pP
36fd0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  age);.}../*.** R
36fe0 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
36ff0 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  ference..**.** T
37000 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  he sqlite3PagerU
37010 6e 72 65 66 28 29 20 61 6e 64 20 73 71 6c 69 74  nref() and sqlit
37020 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
37030 75 6c 6c 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ull() may only b
37040 65 0a 2a 2a 20 75 73 65 64 20 69 66 20 77 65 20  e.** used if we 
37050 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61  know that the pa
37060 67 65 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65  ge being release
37070 64 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  d is not the las
37080 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62  t page..** The b
37090 74 72 65 65 20 6c 61 79 65 72 20 61 6c 77 61 79  tree layer alway
370a0 73 20 68 6f 6c 64 73 20 70 61 67 65 31 20 6f 70  s holds page1 op
370b0 65 6e 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64  en until the end
370c0 2c 20 73 6f 20 74 68 65 73 65 20 66 69 72 73 74  , so these first
370d0 0a 2a 2a 20 74 6f 20 72 6f 75 74 69 6e 65 73 20  .** to routines 
370e0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
370f0 65 6c 65 61 73 65 20 61 6e 79 20 70 61 67 65 20  elease any page 
37100 6f 74 68 65 72 20 74 68 61 6e 20 42 74 53 68 61  other than BtSha
37110 72 65 64 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a  red.pPage1..**.*
37120 2a 20 55 73 65 20 73 71 6c 69 74 65 33 50 61 67  * Use sqlite3Pag
37130 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 29  erUnrefPageOne()
37140 20 74 6f 20 72 65 6c 65 61 73 65 20 70 61 67 65   to release page
37150 31 2e 20 20 54 68 69 73 20 6c 61 74 74 65 72 20  1.  This latter 
37160 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b  routine.** check
37170 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
37180 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
37190 67 20 70 61 67 65 73 20 61 6e 64 20 69 66 20 74  g pages and if t
371a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
371b0 70 61 67 65 73 20 72 65 61 63 68 65 73 20 7a 65  pages reaches ze
371c0 72 6f 20 69 74 20 64 72 6f 70 73 20 74 68 65 20  ro it drops the 
371d0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a  database lock..*
371e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
371f0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
37200 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
37210 54 45 53 54 4f 4e 4c 59 28 20 50 61 67 65 72 20  TESTONLY( Pager 
37220 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
37230 50 61 67 65 72 3b 20 29 0a 20 20 61 73 73 65 72  Pager; ).  asser
37240 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 69  t( pPg!=0 );.  i
37250 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  f( pPg->flags & 
37260 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20  PGHDR_MMAP ){.  
37270 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
37280 67 6e 6f 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61  gno!=1 );  /* Pa
37290 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d  ge1 is never mem
372a0 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20  ory mapped */.  
372b0 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
372c0 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  pPage(pPg);.  }e
372d0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
372e0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
372f0 67 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20  g);.  }.  /* Do 
37300 6e 6f 74 20 75 73 65 20 74 68 69 73 20 72 6f 75  not use this rou
37310 74 69 6e 65 20 74 6f 20 72 65 6c 65 61 73 65 20  tine to release 
37320 74 68 65 20 6c 61 73 74 20 72 65 66 65 72 65 6e  the last referen
37330 63 65 20 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20  ce to page1 */. 
37340 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
37350 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
37360 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
37370 30 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  0 );.}.void sqli
37380 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
37390 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
373a0 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50  ( pPg ) sqlite3P
373b0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
373c0 28 70 50 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  (pPg);.}.void sq
373d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50  lite3PagerUnrefP
373e0 61 67 65 4f 6e 65 28 44 62 50 61 67 65 20 2a 70  ageOne(DbPage *p
373f0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
37400 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
37410 70 50 67 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pPg!=0 );.  asse
37420 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31  rt( pPg->pgno==1
37430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
37440 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
37450 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a  R_MMAP)==0 ); /*
37460 20 50 61 67 65 31 20 69 73 20 6e 65 76 65 72 20   Page1 is never 
37470 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f  memory mapped */
37480 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
37490 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74  >pPager;.  sqlit
374a0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
374b0 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  pPg);.  pagerUnl
374c0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
374d0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  er);.}../*.** Th
374e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
374f0 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
37500 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
37510 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
37520 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
37530 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
37540 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
37550 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
37560 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
37570 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
37580 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
37590 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
375a0 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
375b0 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
375c0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
375d0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
375e0 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
375f0 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
37600 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
37610 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
37620 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
37630 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
37640 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
37650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
37660 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
37670 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
37680 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
37690 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
376a0 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
376b0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
376c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
376d0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
376e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
376f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
37700 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
37710 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
37720 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
37730 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
37740 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
37750 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
37760 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
37770 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
37780 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
37790 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
377a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
377b0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
377c0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
377d0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
377e0 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
377f0 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
37800 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
37810 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
37820 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
37830 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
37840 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
37850 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
37860 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
37870 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
37880 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
37890 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
378a0 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
378b0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
378c0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
378d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
378e0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
378f0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
37900 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37910 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
37920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37930 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
37940 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
37950 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
37960 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
37970 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
37980 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
37990 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
379a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
379b0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
379c0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
379d0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
379e0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
379f0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
37a00 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
37a10 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
37a20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
37a30 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
37a40 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
37a50 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
37a60 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
37a70 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
37a80 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
37a90 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
37aa0 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
37ab0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
37ac0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
37ad0 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
37ae0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
37af0 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
37b00 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
37b10 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
37b20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37b30 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
37b40 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
37b50 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
37b60 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
37b70 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
37b80 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37b90 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
37ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
37bb0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
37bc0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
37bd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
37be0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
37bf0 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
37c00 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
37c10 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
37c20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
37c30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
37c40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
37c50 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
37c60 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
37c70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
37c80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
37c90 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
37ca0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
37cb0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
37cc0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
37cd0 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c        int nSpill
37ce0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
37cf0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
37d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
37d10 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50  gs |= (SQLITE_OP
37d20 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
37d30 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
37d40 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  P_JOURNAL);.    
37d50 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73        nSpill = s
37d60 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74  qlite3Config.nSt
37d70 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20  mtSpill;.       
37d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37d90 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
37da0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
37db0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  NAL;.          n
37dc0 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66  Spill = jrnlBuff
37dd0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  erSize(pPager);.
37de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37df0 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20      .        /* 
37e00 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
37e10 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68  database still h
37e20 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
37e30 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a   as it did when.
37e40 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61          ** it wa
37e50 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  s originally ope
37e60 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ned. */.        
37e70 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73 55  rc = databaseIsU
37e80 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a  nmoved(pPager);.
37e90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
37ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37eb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
37ec0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28  te3JournalOpen (
37ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
37ee0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
37ef0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
37f00 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c  fd, flags, nSpil
37f10 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  l.          );. 
37f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37f30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
37f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
37f50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
37f60 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
37f70 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
37f80 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
37f90 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
37fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
37fb0 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
37fc0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
37fd0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
37fe0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
37ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
38000 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
38010 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
38020 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
38030 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
38040 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
38050 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
38060 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
38070 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
38080 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
38090 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
380a0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
380b0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
380c0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
380d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
380e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
380f0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
38100 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
38110 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
38120 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
38130 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
38140 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
38150 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
38160 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
38170 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
38180 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
38190 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
381a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
381b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
381c0 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
381d0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
381e0 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
381f0 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
38200 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
38210 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
38220 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
38230 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
38240 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
38250 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
38260 20 69 73 20 30 2c 20 74 68 65 6e 20 61 63 71 75   is 0, then acqu
38270 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
38280 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
38290 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
382a0 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
382b0 69 73 20 3e 30 2c 20 74 68 65 6e 20 61 63 71 75  is >0, then acqu
382c0 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
382d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
382e0 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
382f0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
38300 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
38310 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
38320 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
38330 2a 20 49 66 20 28 65 78 46 6c 61 67 3c 30 29 20  * If (exFlag<0) 
38340 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
38350 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
38360 20 64 6f 20 6e 6f 74 20 74 61 6b 65 20 61 6e 79   do not take any
38370 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65 20 74   locks..** The t
38380 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
38390 72 75 6e 20 69 6e 20 43 4f 4e 43 55 52 52 45 4e  run in CONCURREN
383a0 54 20 6d 6f 64 65 20 69 6e 73 74 65 61 64 2e 0a  T mode instead..
383b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
383c0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
383d0 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
383e0 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
383f0 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
38400 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
38410 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
38420 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
38430 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
38440 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
38450 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
38460 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
38470 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
38480 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
38490 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
384a0 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
384b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
384c0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
384d0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
384e0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
384f0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
38500 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
38510 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
38520 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
38530 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
38540 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
38550 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
38560 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
38570 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
38580 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
38590 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
385a0 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
385b0 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
385c0 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
385d0 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
385e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
385f0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
38600 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
38610 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
38620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
38630 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
38640 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
38650 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
38660 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
38670 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
38680 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
38690 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
386a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
386b0 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){