/ Hex Artifact Content
Login

Artifact 3936b32a0a45f1b80462b38ba1ed0556e62843554a089ab9c4be1a35c97f23bc:


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 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8630: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8640: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8650: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8670: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8680: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8690: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
86a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
86b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
86c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
86d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28  pages */.  int (
86e0: 2a 78 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67  *xGet)(Pager*,Pg
86f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
8700: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  ; /* Routine to 
8710: 66 65 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f  fetch a patch */
8720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
8730: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
8740: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
8750: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
8760: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
8770: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
8780: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  a */.  void (*xC
8790: 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
87a0: 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a  id*,int,int); /*
87b0: 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20   Notify of page 
87c0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  size changes */.
87d0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
87e0: 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20  ree)(void*);    
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
8800: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63  ructor for the c
8810: 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  odec */.  void *
8820: 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20  pCodec;         
8830: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
8840: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
8850: 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  c... methods */.
8860: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
8870: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
8880: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
8890: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
88a0: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
88b0: 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  e */.  PCache *p
88c0: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
88d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
88e0: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
88f0: 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ct */.#ifndef SQ
8900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
8910: 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20  Wal *pWal;      
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
8930: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75  rite-ahead log u
8940: 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f  sed by "journal_
8950: 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63  mode=wal" */.  c
8960: 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20  har *zWal;      
8970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8980: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74  le name for writ
8990: 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23  e-ahead log */.#
89a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
89b0: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
89c0: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
89d0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
89e0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
89f0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
8a00: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
8a10: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
8a20: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8a30: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8a40: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8a50: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8a60: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8a70: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8a80: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8a90: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8aa0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ab0: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8ad0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8ae0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8af0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b00: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b10: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b20: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b30: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b40: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b50: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b60: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b70: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8b80: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8b90: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8ba0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8bc0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bd0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8be0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8bf0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c00: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c10: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c40: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c70: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8c80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8c90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8ca0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cb0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8cc0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cd0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ce0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8cf0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d00: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d10: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d20: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d30: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d40: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d50: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8d80: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8d90: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8da0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8db0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8dc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8dd0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8de0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e00: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e10: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e20: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e30: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e40: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e50: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8e80: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8e90: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ea0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8eb0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ec0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ed0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8ee0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8ef0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f10: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f20: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f30: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f40: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f50: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f60: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f70: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8f80: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8f90: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fa0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fc0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8fd0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8fe0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8ff0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9000: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9010: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9020: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9030: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9040: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9050: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9060: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9070: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
9080: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
9090: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90a0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90b0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90c0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90d0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
90e0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
90f0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9100: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9110: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9120: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9130: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9140: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9150: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9160: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9170: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
9180: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
9190: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91a0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91b0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91c0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
91e0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
91f0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9200: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9210: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9220: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9230: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9240: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9250: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9270: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9280: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9290: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92a0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92b0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92c0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
92e0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
92f0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9300: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9310: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9320: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9330: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9340: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9360: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9370: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9380: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9390: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93a0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93b0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93d0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
93e0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
93f0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9400: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9410: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9420: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9430: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9440: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9450: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9460: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9470: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9480: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94a0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94b0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94d0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
94e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
94f0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9500: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9510: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9520: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9530: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9540: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9550: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9560: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9570: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9580: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9590: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95a0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95b0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95c0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95d0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
95e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
95f0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9600: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9610: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9620: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9630: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9640: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9650: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9660: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9670: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
9680: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
9690: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96a0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96b0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96c0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96d0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
96e0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
96f0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9700: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9710: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9720: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9730: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9740: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9750: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9760: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9770: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
9780: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
9790: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97a0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97b0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97c0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97d0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
97e0: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
97f0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9800: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9810: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9820: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9830: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9840: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9850: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9870: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9880: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9890: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98a0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
98e0: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
98f0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9900: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9910: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9920: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9940: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9950: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9960: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9970: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9980: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9990: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99a0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99b0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99c0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99d0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
99e0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
99f0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a00: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a10: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a20: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a30: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a40: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a50: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a60: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a70: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9a80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9a90: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9aa0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ab0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ac0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9ad0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9ae0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9af0: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b00: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b10: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b20: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b30: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b40: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b50: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b60: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b70: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9b80: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9b90: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9ba0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bb0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9bc0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bd0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
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 57 52 49 54 45 52  te==PAGER_WRITER
9c00: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c10: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c20: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c30: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c40: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c50: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c60: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c70: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9c80: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9c90: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9ca0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cb0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9cc0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9ce0: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9cf0: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d00: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d10: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d20: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d30: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d50: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d60: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d70: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9d80: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9d90: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9da0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9db0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9dc0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9dd0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9de0: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9df0: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e10: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e30: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e40: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e70: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9e80: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9e90: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ea0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9eb0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ec0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ed0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9ee0: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9ef0: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f00: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f10: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f20: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f30: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f40: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f50: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f60: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f70: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9f80: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9f90: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fa0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fb0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fc0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9fd0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
9fe0: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
9ff0: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a010: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a030: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a040: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a050: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a060: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a070: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a080: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a090: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0a0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0c0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a0e0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a0f0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a100: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a110: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a120: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a130: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a140: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a150: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a160: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a170: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a180: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a190: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1a0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1b0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1c0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1d0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a1e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a1f0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a200: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a210: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a220: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a230: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a240: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a250: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a260: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a270: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a280: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a290: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2a0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2b0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a2e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a2f0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a300: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a310: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a320: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a330: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a340: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a350: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a360: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a380: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a390: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3d0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a3e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a3f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a400: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a410: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a420: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a430: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a450: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a460: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a470: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a480: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a490: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4a0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4d0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a4e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a500: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a510: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a520: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a530: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a540: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a550: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a560: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a570: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a580: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a590: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5b0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a5f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a600: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a610: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a620: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a630: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a640: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a660: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a670: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a690: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6a0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6b0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6c0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6d0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a6e0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a6f0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a700: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a710: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a720: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a740: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a750: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a760: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a770: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a780: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a790: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7a0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a7e0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a800: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a810: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a820: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a840: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a850: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a860: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a870: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a880: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a890: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8d0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a8e0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a8f0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a900: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a910: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a920: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a930: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a940: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a950: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a960: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a970: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a980: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a990: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9c0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
a9e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
a9f0: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa00: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa10: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa30: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa40: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa50: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa60: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa70: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aa80: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aa90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aaa0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aac0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aad0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
aae0: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
aaf0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab00: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab10: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab20: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab50: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab60: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab70: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ab80: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
ab90: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
aba0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abb0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abc0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abd0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
abf0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac00: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac10: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac20: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac30: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac40: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac50: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac60: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac70: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
ac80: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
ac90: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
aca0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acb0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
acc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acd0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ace0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
acf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad00: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad10: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad20: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad30: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad40: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad50: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ad80: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
ad90: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ada0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
adb0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
adc0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
add0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ade0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
adf0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae00: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae10: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae20: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae30: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae40: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae50: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae60: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae70: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
ae80: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
ae90: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aea0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
aec0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aed0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
aee0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
aef0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
af00: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
af10: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
af20: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
af30: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
af40: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
af50: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
af60: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
af70: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
af80: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
af90: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
afa0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
afb0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
afc0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
afd0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
afe0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
aff0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b000: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b010: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b020: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b030: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b040: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b050: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b060: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b070: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b080: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b090: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b0a0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b0b0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b0c0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b0d0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b0e0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b0f0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b100: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b110: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b120: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b130: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b140: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b150: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b160: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b170: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b180: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b190: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b1a0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b1b0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b1c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b1d0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b1e0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b1f0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b200: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b210: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b220: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b230: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b240: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b250: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b260: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b270: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b280: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b290: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b2a0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b2b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b2c0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b2d0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b2e0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b2f0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b300: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b310: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b320: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b330: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b340: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b350: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b360: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b370: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b380: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b390: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3a0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b3b0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3e0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b3f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b400: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b410: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b420: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b430: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b440: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b450: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b460: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b470: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b480: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b490: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b4a0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b4b0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b4c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b4d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b4e0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b4f0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b500: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b510: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b520: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b530: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b540: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b550: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b560: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b570: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b580: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b590: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b5a0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b5b0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b5c0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b5d0: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b5e0: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b5f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b600: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b610: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b620: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b630: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b640: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b650: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b660: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b670: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b680: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b690: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6a0: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b6b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b6c0: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b6d0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b6e0: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b6f0: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b700: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b710: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b720: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b730: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b740: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b750: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b760: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b770: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b780: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b790: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b7a0: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b7b0: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b7c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b7d0: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b7e0: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b7f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b800: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b810: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b820: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b830: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b840: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b850: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b870: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b880: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b890: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b8a0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b8b0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b8c0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b8d0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b8e0: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b8f0: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b900: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b910: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b920: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b930: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b940: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
b950: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
b960: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
b970: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
b980: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b990: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b9a0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b9b0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b9c0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
b9e0: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
b9f0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ba00: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ba10: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
ba20: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
ba30: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
ba40: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
ba50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ba60: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ba70: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
ba80: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
ba90: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
baa0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bab0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bac0: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
bad0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bae0: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
baf0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bb20: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bb30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bb40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bb50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bb60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bb70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bb80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bb90: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bba0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bbb0: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bbc0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bbd0: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bbe0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bbf0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bc00: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bc10: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bc20: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bc30: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bc40: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bc50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bc60: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bc70: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bc80: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bc90: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bca0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bcb0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bcc0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bcf0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bd00: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bd10: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bd20: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bd30: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bd40: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
bd50: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
bd60: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bd70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
bd80: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
bd90: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
bda0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdb0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
bdc0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
bdd0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
bde0: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
bdf0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
be00: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
be10: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
be20: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
be30: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
be40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
be50: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
be60: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
be70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
be80: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
be90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bea0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
beb0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bec0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bed0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bee0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bef0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bf00: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bf10: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bf20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bf30: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bf40: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
bf50: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bf60: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bf70: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bf80: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bf90: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
bfa0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
bfb0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
bfc0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
bfd0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
bfe0: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
bff0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c000: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c010: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c020: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c030: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c040: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c050: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c060: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c070: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c080: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c090: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c0a0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c0b0: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c0c0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c0d0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c0e0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c0f0: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c100: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c110: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c130: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c140: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c150: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c160: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c170: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c180: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c190: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c1a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c1b0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c1c0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c1d0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c1e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c1f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c200: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c210: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c220: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c230: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c240: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c250: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c260: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c270: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c280: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c290: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c2a0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c2b0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c2c0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c2d0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c2e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c2f0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c310: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c320: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c330: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c340: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c350: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c360: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c370: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c380: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c390: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c3a0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c3b0: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c3c0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c3d0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c3e0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c3f0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c400: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c410: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c420: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c430: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c440: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c450: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c460: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c470: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c480: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c490: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c4a0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c4b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c4c0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c4d0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c4e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c4f0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c500: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c510: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c520: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c530: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c540: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c550: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c560: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c570: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c580: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c590: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c5a0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c5b0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c5c0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c5d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c5e0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c5f0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c600: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c610: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c620: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c630: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c640: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c650: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c660: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c670: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c680: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c690: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c6a0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c6b0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c6c0: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c6d0: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c6e0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c6f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c700: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c710: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c720: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c730: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c740: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c750: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c760: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c770: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c780: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c790: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c7a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c7b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c7c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c7d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c7e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c7f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c800: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c810: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c820: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c830: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c840: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c850: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c860: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c870: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c880: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c890: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c8b0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c8d0: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c8e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c8f0: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c900: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c910: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c920: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c930: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c940: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
c950: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
c960: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
c970: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
c980: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c990: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c9a0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c9b0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c9c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
c9d0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
c9e0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
c9f0: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
ca00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
ca10: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
ca20: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
ca30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ca50: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
ca60: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
ca70: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
ca80: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
ca90: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
caa0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cab0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6e  pPager->fd);.#en
cac0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
cad0: 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
cae0: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 69  ATOMIC_WRITE.  i
caf0: 66 28 20 64 63 26 53 51 4c 49 54 45 5f 49 4f 43  f( dc&SQLITE_IOC
cb00: 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20  AP_BATCH_ATOMIC 
cb10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ){.    return -1
cb20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
cb30: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cb40: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
cb50: 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 65 63    {.    int nSec
cb60: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
cb70: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 69 6e  ctorSize;.    in
cb80: 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
cb90: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20  r->pageSize;..  
cba0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
cbb0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
cbc0: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
cbd0: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
cbe0: 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
cbf0: 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
cc00: 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49  if( 0==(dc&(SQLI
cc10: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
cc20: 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20  (szPage>>8)) || 
cc30: 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20  nSector>szPage) 
cc40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cc50: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
cc60: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
cc70: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cc80: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
cc90: 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
cca0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ccb0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
ccc0: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
ccd0: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
cce0: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
ccf0: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
cd00: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
cd10: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
cd20: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
cd30: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
cd40: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
cd50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
cd60: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
cd70: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
cd80: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
cd90: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
cda0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
cdb0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
cdc0: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
cdd0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
cde0: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
cdf0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
ce00: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
ce10: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
ce20: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
ce30: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
ce40: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
ce50: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
ce60: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
ce70: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
ce80: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
ce90: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
cea0: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
ceb0: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
cec0: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
ced0: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
cee0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
cef0: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
cf00: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
cf10: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
cf20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
cf30: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
cf40: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
cf50: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
cf60: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
cf70: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
cf80: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
cf90: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
cfa0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
cfb0: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
cfc0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
cfd0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
cfe0: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
cff0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
d000: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
d010: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
d020: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
d030: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
d040: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
d050: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
d060: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
d070: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d080: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
d090: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
d0a0: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
d0b0: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
d0c0: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
d0d0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
d0e0: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
d0f0: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
d100: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
d110: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
d120: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
d130: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
d140: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
d150: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
d160: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
d170: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
d180: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
d190: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
d1a0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
d1b0: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
d1c0: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
d1d0: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
d1e0: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
d1f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d200: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
d210: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
d220: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
d230: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
d240: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
d250: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
d260: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
d270: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
d280: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
d290: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
d2a0: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
d2b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d2c0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
d2d0: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
d2e0: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
d2f0: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
d300: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
d310: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
d320: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
d330: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
d340: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
d350: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
d360: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
d370: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
d380: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
d390: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
d3a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d3b0: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
d3c0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
d3d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
d3e0: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
d3f0: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
d400: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
d410: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
d420: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
d430: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
d440: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
d450: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
d460: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
d470: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
d480: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d490: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
d4a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
d4b0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
d4c0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
d4d0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
d4e0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
d4f0: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
d500: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
d510: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
d520: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
d530: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
d540: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
d550: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
d560: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
d570: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
d580: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d590: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
d5a0: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
d5b0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
d5c0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
d5d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
d5e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
d5f0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
d600: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
d610: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
d620: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
d630: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
d640: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
d650: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
d660: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
d670: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
d680: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
d6b0: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
d6e0: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
d6f0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d700: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d720: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
d730: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
d740: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
d750: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
d760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
d770: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
d780: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d790: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d7c0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d7d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d7e0: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d7f0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d800: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d810: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d820: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d830: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d840: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d850: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d860: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d870: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d880: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d890: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d8a0: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d8b0: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d8c0: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d8d0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d8e0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d8f0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d900: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d910: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d920: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d930: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d940: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
d950: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
d960: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d970: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d980: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d990: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d9a0: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d9b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d9c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d9d0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d9e0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d9f0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
da00: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
da10: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
da20: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
da30: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
da40: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
da50: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
da60: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
da70: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
da80: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
da90: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
daa0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
dab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
dac0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
dad0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
dae0: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
daf0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
db00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
db10: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
db20: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
db30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
db40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
db50: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
db60: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
db70: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
db80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
db90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
dba0: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
dbb0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
dbc0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
dbd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
dbe0: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
dbf0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
dc00: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
dc10: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
dc20: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
dc30: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
dc40: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
dc50: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
dc60: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
dc70: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
dc80: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
dc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcb0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
dd20: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
dd30: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
dd40: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
dd50: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
dd60: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
dd70: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
dd80: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
dd90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
dda0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
ddb0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
ddc0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
ddd0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
dde0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ddf0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
de00: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
de10: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
de20: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
de30: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
de40: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
de50: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
de60: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
de70: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
de80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
de90: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
dea0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
deb0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
dec0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
ded0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
dee0: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
def0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
df00: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
df10: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
df20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
df30: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
df40: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
df50: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
df60: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
df70: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
df80: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
df90: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
dfa0: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
dfb0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
dfc0: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
dfd0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
dfe0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
dff0: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
e000: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
e010: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e020: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
e030: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
e040: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
e050: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
e060: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
e070: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
e080: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
e090: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
e0a0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
e0b0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
e0c0: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
e0d0: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
e0e0: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
e0f0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
e100: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
e110: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
e120: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
e130: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
e140: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
e150: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
e160: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
e170: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
e180: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
e190: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
e1a0: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
e1b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
e1c0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
e1d0: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
e1e0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
e1f0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
e200: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
e210: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
e220: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
e230: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
e240: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
e250: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
e260: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
e270: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
e280: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
e290: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
e2a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e2b0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e2e0: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
e2f0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
e300: 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
e310: 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e  t( !sqlite3Journ
e320: 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
e330: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
e340: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
e350: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
e360: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
e370: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
e380: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
e390: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
e3a0: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
e3b0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
e3c0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
e3d0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
e3e0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
e3f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e400: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
e410: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
e420: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e430: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
e440: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
e450: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
e460: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
e470: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
e480: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
e490: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
e4a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e4b0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
e4c0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
e4d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e4e0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
e4f0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
e500: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
e510: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
e520: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
e530: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
e540: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
e550: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
e560: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
e570: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
e580: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
e590: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
e5a0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
e5b0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
e5c0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
e5d0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
e5e0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
e5f0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
e600: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
e610: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
e620: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
e630: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
e640: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
e650: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
e660: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
e670: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
e680: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
e690: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
e6a0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
e6b0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
e6c0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
e6d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
e6e0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
e6f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e700: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
e710: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e720: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e730: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
e740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
e770: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e780: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e790: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e7a0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e7b0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e7c0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e7d0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e7e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e7f0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e800: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e810: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e820: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e830: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e840: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e850: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e860: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e870: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e880: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e890: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e8a0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e8b0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e8c0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e8d0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e8e0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e8f0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e900: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e910: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e920: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e930: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e940: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e950: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e960: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e970: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e980: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e990: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e9a0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e9b0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e9c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e9d0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e9e0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e9f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ea00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ea10: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ea20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
ea30: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
ea40: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
ea50: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
ea60: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
ea70: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
ea80: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
ea90: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
eaa0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
eab0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
eac0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
ead0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
eaf0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
eb00: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
eb10: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
eb40: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
eb50: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
eb60: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
eb70: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
eb80: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
eb90: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
eba0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
ebb0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
ebc0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
ebd0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
ebe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
ebf0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
ec00: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
ec10: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
ec20: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
ec30: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
ec40: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
ec50: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
ec60: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
ec70: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
ec80: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
ec90: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
eca0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
ecb0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
ecc0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
ecd0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
ece0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
ecf0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
ed00: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
ed10: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
ed20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ed30: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
ed40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ed50: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
ed60: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
ed70: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
ed80: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
ed90: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
eda0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
edb0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
edc0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
edd0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
ede0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
edf0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
ee00: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
ee10: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
ee20: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
ee30: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
ee40: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
ee50: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
ee60: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
ee70: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
ee80: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
ee90: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
eea0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
eeb0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
eec0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
eed0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
eee0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
eef0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
ef00: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
ef10: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
ef20: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
ef30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
ef40: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
ef50: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
ef60: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
ef70: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
ef80: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
ef90: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
efa0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
efb0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
efc0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
efd0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
efe0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
eff0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
f000: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
f010: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
f020: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
f030: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
f040: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
f050: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
f060: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
f070: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
f080: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
f090: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
f0a0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
f0b0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
f0c0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
f0d0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
f0e0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
f0f0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
f100: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
f110: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
f120: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
f130: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
f140: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
f150: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
f160: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
f170: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
f180: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
f190: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
f1a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
f1b0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
f1c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
f1d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
f1e0: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
f1f0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
f200: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
f210: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
f220: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
f230: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
f240: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
f250: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f260: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f270: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
f280: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f290: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f2a0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
f2b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
f2c0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
f2d0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
f2e0: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
f2f0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
f300: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
f310: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
f320: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
f330: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
f340: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
f350: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
f360: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f370: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f380: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
f390: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f3a0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
f3b0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
f3c0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
f3d0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f3e0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f3f0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
f400: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
f410: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
f420: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
f430: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
f440: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f450: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f460: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
f470: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
f480: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
f490: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
f4a0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
f4b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f4c0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
f4d0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
f4e0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
f4f0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
f500: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
f510: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
f520: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
f530: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
f540: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
f550: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
f560: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
f570: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
f580: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
f590: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
f5a0: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
f5b0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
f5c0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
f5d0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
f5e0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f5f0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f600: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
f610: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
f620: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f630: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
f640: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
f650: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
f660: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
f670: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
f680: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
f690: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
f6a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
f6b0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
f6c0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
f6d0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
f6e0: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
f6f0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
f700: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
f710: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
f720: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
f730: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
f740: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
f750: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
f760: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
f770: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
f780: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f790: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f7a0: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f7b0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f7c0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f7d0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f7e0: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f7f0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f800: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f810: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f820: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f830: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f840: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f850: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f860: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f870: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f880: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f890: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f8a0: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f8b0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f8c0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f8d0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f8e0: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f8f0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f900: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f910: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f920: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f930: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f940: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f950: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f960: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f970: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f980: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f990: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f9a0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f9b0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f9c0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f9d0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f9e0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f9f0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
fa00: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
fa10: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
fa20: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
fa30: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
fa40: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
fa50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
fa60: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
fa70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
fa80: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
fa90: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
faa0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
fab0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
fac0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
fad0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
fae0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
faf0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
fb00: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
fb10: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
fb20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
fb30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
fb40: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
fb50: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
fb60: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
fb70: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
fb80: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
fb90: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
fba0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
fbb0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
fbc0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
fbd0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
fbe0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
fbf0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
fc00: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
fc10: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
fc20: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
fc30: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
fc40: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
fc50: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
fc60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fc70: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
fc80: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
fc90: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
fca0: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
fcb0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
fcc0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
fcd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
fce0: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
fcf0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
fd00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
fd10: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
fd20: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fd30: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
fd40: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
fd50: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
fd60: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
fd70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
fd80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
fd90: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
fda0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
fdb0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
fdc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fdd0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
fde0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
fdf0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
fe00: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
fe10: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
fe20: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
fe30: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
fe40: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
fe50: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
fe60: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
fe70: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
fe80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
fe90: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
fea0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
feb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
fec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
fed0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
fee0: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
fef0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
ff00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ff10: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
ff20: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
ff30: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
ff40: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
ff50: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
ff60: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
ff70: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
ff80: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ffa0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
ffb0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
ffc0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
ffd0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
10000 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
10010 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
10020 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
10030 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
10040 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
10050 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
10070 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
10080 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
10090 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
100a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
100b0 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
100c0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
100d0 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
100e0 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
100f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
10100 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
10110 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
10120 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
10130 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
10140 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
10150 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
10160 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
10170 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
10180 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
10190 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
101a0 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
101b0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
101c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
101d0 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
101e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
101f0 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
10200 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10210 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
10220 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
10230 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
10240 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
10250 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
10260 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
10270 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
10280 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
10290 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
102a0 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
102b0 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
102c0 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
102d0 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
102e0 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
102f0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10300 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
10310 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
10320 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
10330 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
10340 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
10350 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
10360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
10370 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
10380 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
10390 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
103a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
103b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
103c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
103d0 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
103e0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
103f0 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
10400 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10410 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
10420 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
10430 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
10440 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
10450 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10460 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
10470 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
10480 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
10490 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
104a0 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
104b0 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
104c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
104d0 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
104e0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
104f0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
10500 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
10510 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
10520 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10530 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
10540 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
10550 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10560 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10570 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
10580 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
10590 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
105a0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
105b0 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
105c0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
105d0 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
105e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
105f0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
10600 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
10610 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
10620 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
10630 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
10640 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
10650 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
10660 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10680 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
10690 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
106a0 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
106b0 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
106c0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
106d0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
106e0 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
106f0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
10700 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10710 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10720 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
10730 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
10740 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10750 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10760 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10770 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
10780 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
10790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
107a0 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
107b0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
107c0 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
107d0 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
107e0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
107f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10800 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10810 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10820 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
10830 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
10840 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
10850 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
10860 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
10870 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10880 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
10890 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
108a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
108b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
108c0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
108d0 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
108e0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
108f0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10900 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10910 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10920 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
10930 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
10940 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
10950 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
10960 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
10970 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
10980 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
10990 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
109a0 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
109b0 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
109c0 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
109d0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
109e0 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
109f0 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10a00 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10a10 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10a20 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10a30 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
10a40 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
10a50 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
10a60 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
10a70 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
10a80 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
10a90 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
10aa0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10ab0 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
10ac0 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
10ad0 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10ae0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10af0 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10b00 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10b10 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10b20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10b30 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10b40 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10b50 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10b60 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10b70 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
10b80 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10b90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10ba0 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
10bb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10bc0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10bd0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10be0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10bf0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10c00 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10c10 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10c20 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10c30 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10c40 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10c50 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10c60 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10c70 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
10c80 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10c90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10ca0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
10cb0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10cc0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
10cd0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10ce0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10cf0 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10d00 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10d10 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10d20 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10d30 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10d40 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10d50 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10d60 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10d70 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10d80 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10d90 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10da0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
10db0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10dc0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
10dd0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10de0 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10df0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10e00 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10e10 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10e20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10e30 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10e40 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10e50 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10e60 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10e70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
10e80 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10e90 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10ea0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
10eb0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10ec0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ed0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10ee0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10ef0 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10f00 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10f10 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10f20 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10f30 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10f40 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10f50 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10f60 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10f70 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
10f80 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10f90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10fa0 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
10fb0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
10fc0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
10fd0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10fe0 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10ff0 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
11000 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
11010 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
11020 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
11030 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11040 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
11050 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
11060 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
11070 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11080 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
11090 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
110a0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
110b0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
110c0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
110d0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
110e0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
110f0 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
11100 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
11110 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
11120 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
11130 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
11140 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
11150 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
11160 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
11170 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
11180 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
11190 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
111a0 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
111b0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
111c0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
111d0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
111e0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
111f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
11200 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
11210 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11220 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
11230 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
11260 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
11270 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11290 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
112a0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
112b0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
112e0 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
112f0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
11300 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
11310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11320 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
11330 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
11340 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11360 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
11370 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
11380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11390 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
113a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
113b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
113c0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
113d0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
113e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
113f0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
11400 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
11410 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
11420 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
11430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11440 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
11450 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
11460 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11470 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
11480 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11490 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
114a0 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
114b0 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
114c0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
114d0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
114e0 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
114f0 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
11500 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
11510 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
11520 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
11530 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
11540 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
11550 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
11560 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
11570 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
11580 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11590 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
115a0 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
115b0 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
115c0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
115d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
115e0 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
115f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
11600 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
11610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11620 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
11630 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
11640 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
11650 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
11660 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
11670 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
11680 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
11690 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
116a0 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
116b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
116c0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
116d0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
116e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
116f0 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11700 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11710 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
11720 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
11730 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11740 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
11750 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
11760 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
11770 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
11780 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11790 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
117a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
117b0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
117c0 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
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 2b 34 2b 6e  jfd, iHdrOff+4+n
11800 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11810 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11820 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11830 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
11840 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
11850 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
11880 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
11890 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
118a0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
118b0 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
118c0 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
118d0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
118e0 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
118f0 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11900 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11910 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11920 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
11930 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
11940 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11950 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
11960 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
11970 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
11980 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
11990 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
119a0 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
119b0 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
119c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
119d0 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
119e0 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
119f0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11a00 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11a10 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11a20 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
11a30 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
11a40 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
11a50 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
11a60 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
11a70 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
11a80 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
11a90 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
11aa0 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
11ab0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11ac0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
11ad0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11ae0 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11af0 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11b00 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11b10 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11b20 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11b30 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
11b40 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11b50 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
11b60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11b70 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
11b80 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11b90 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11ba0 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11bb0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11bc0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11bd0 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11be0 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11bf0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11c00 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11c10 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11c20 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
11c30 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
11c40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11c50 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
11c60 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
11c70 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
11c80 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
11c90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
11ca0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11cb0 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
11cc0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
11cd0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11ce0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11cf0 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11d00 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11d10 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11d20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11d30 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11d40 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11d50 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11d60 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11d70 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
11d80 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11d90 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11da0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
11db0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11dc0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11dd0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11de0 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11e00 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11e10 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11e20 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11e30 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11e40 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11e50 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11e60 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11e70 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
11e80 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11e90 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
11ea0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
11eb0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
11ec0 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
11ed0 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11ee0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11ef0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11f00 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11f10 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11f20 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
11f30 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
11f40 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11f50 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
11f60 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
11f70 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
11f80 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
11f90 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
11fa0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
11fb0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
11fc0 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11fd0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11fe0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11ff0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
12000 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
12010 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
12020 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
12030 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
12040 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
12050 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
12060 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
12070 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
12080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12090 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
120a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
120b0 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
120c0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
120d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
120e0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
120f0 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
12100 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
12110 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
12120 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
12130 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
12140 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
12150 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
12160 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
12170 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
12180 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
12190 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
121a0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
121b0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
121c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
121d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
121e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
121f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
12200 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
12210 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
12220 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
12230 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
12240 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
12250 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
12260 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
12270 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
12280 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
12290 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
122a0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
122b0 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
122c0 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
122d0 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
122e0 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
122f0 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
12300 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
12310 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
12320 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
12330 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
12340 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
12350 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
12360 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
12370 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
12380 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
12390 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
123a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
123b0 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
123c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
123d0 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
123e0 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
123f0 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
12400 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
12410 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
12420 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
12430 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
12440 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
12450 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
12460 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
12470 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
12480 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
12490 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
124a0 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
124b0 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
124c0 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
124d0 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
124e0 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
124f0 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
12500 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
12510 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
12520 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
12530 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
12540 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
12550 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
12560 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
12570 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
12580 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
12590 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
125a0 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
125b0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
125c0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
125d0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
125e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
125f0 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
12600 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
12610 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
12620 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
12630 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12640 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
12650 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
12660 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
12670 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
12680 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
12690 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
126a0 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
126b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
126c0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
126d0 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
12700 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
12710 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
12720 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
12730 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
12740 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
12750 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
12760 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
12770 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
12780 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
12790 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
127a0 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
127b0 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
127c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
127d0 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
127e0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
127f0 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
12800 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
12810 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
12820 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
12830 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
12840 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
12850 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
12860 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
12870 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12880 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
12890 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
128a0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
128b0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
128c0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
128d0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
128e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
128f0 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12900 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12910 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
12920 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
12930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12940 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12950 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
12960 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12970 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12980 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
12990 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
129a0 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
129b0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
129c0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
129d0 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
129e0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
129f0 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
12a00 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12a10 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
12a20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
12a30 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
12a40 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12a50 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
12a60 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
12a70 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
12a80 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
12a90 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
12aa0 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
12ab0 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
12ac0 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
12ad0 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
12ae0 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
12af0 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
12b00 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
12b10 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
12b20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
12b30 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
12b40 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
12b50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
12b60 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
12b70 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
12b80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12b90 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
12ba0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
12bb0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
12bc0 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
12bd0 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
12be0 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
12bf0 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
12c00 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
12c10 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
12c20 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
12c30 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
12c40 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
12c50 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
12c60 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
12c70 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
12c80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12c90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12ca0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
12cb0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
12cc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
12cd0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
12ce0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
12cf0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12d00 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
12d10 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
12d20 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
12d30 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12d40 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
12d50 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
12d60 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
12d70 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
12d80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
12d90 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
12da0 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
12db0 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
12dc0 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12dd0 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12de0 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12df0 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12e00 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12e10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12e20 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12e30 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12e40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
12e50 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
12e60 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
12e70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  e==0 ){.      pa
12e80 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12e90 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
12ea0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12eb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
12ec0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12ed0 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ER_OPEN;.    }el
12ee0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
12ef0 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70  ->eState = (isOp
12f00 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12f10 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50  ? PAGER_OPEN : P
12f20 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20  AGER_READER);.  
12f30 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46    }.    if( USEF
12f40 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
12f50 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
12f60 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
12f70 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
12f80 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
12f90 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65  OK;.    setGette
12fa0 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
12fb0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12fc0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12fd0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12fe0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12ff0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
13000 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
13010 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
13020 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
13030 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
13040 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
13050 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
13060 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
13070 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
13080 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
13090 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
130a0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
130b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
130c0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
130d0 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
130e0 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
130f0 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
13100 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
13110 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
13120 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
13130 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
13140 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13150 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
13160 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
13170 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13180 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
13190 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
131a0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
131b0 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
131c0 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
131d0 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
131e0 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
131f0 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
13200 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
13210 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
13220 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
13230 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
13240 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
13250 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
13260 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
13270 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
13280 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
13290 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
132a0 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
132b0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
132c0 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
132d0 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
132e0 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
132f0 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
13300 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
13310 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
13320 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
13330 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
13340 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
13350 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
13360 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
13370 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
13380 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
13390 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
133a0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
133b0 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
133c0 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
133d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
133e0 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
133f0 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
13400 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
13410 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
13420 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
13430 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
13440 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
13450 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
13460 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
13470 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
13480 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
13490 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
134a0 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
134b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
134c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
134d0 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
134e0 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
134f0 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
13500 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
13510 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
13520 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
13530 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
13540 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
13550 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
13560 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 65  ER_ERROR;.    se
13570 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50  tGetterMethod(pP
13580 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
13590 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
135a0 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
135b0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
135c0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b  er, Pgno nPage);
135d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74  ../*.** The writ
135e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e transaction op
135f0 65 6e 20 6f 6e 20 70 50 61 67 65 72 20 69 73 20  en on pPager is 
13600 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 20  being committed 
13610 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a 2a 20  (bCommit==1).** 
13620 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 28  or rolled back (
13630 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a 2a 0a  bCommit==0)..**.
13640 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
13650 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6c  f and only if al
13660 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 73 68  l dirty pages sh
13670 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64 20  ould be flushed 
13680 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 52  to disk..**.** R
13690 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ules:.**.**   * 
136a0 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20 64 61   For non-TEMP da
136b0 74 61 62 61 73 65 73 2c 20 61 6c 77 61 79 73 20  tabases, always 
136c0 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20 20 54  sync to disk.  T
136d0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
136e0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20 74 72 61  .**      for tra
136f0 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  nsactions to be 
13700 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  durable..**.**  
13710 20 2a 20 20 53 79 6e 63 20 54 45 4d 50 20 64 61   *  Sync TEMP da
13720 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e 20 61  tabase only on a
13730 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61 20 52   COMMIT (not a R
13740 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20 74 68  OLLBACK) when th
13750 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  e backing.**    
13760 20 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20    file has been 
13770 63 72 65 61 74 65 64 20 61 6c 72 65 61 64 79 20  created already 
13780 28 76 69 61 20 61 20 73 70 69 6c 6c 20 6f 6e 20  (via a spill on 
13790 70 61 67 65 72 53 74 72 65 73 73 28 29 29 20 61  pagerStress()) a
137a0 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68 65 6e 20  nd.**      when 
137b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69  the number of di
137c0 72 74 79 20 70 61 67 65 73 20 69 6e 20 6d 65 6d  rty pages in mem
137d0 6f 72 79 20 65 78 63 65 65 64 73 20 32 35 25 20  ory exceeds 25% 
137e0 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a 2a 20  of the total.** 
137f0 20 20 20 20 20 63 61 63 68 65 20 73 69 7a 65 2e       cache size.
13800 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13810 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69  agerFlushOnCommi
13820 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
13830 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
13840 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
13850 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  pFile==0 ) retur
13860 6e 20 31 3b 0a 20 20 69 66 28 20 21 62 43 6f 6d  n 1;.  if( !bCom
13870 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mit ) return 0;.
13880 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
13890 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75  ager->fd) ) retu
138a0 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 28  rn 0;.  return (
138b0 73 71 6c 69 74 65 33 50 43 61 63 68 65 50 65 72  sqlite3PCachePer
138c0 63 65 6e 74 44 69 72 74 79 28 70 50 61 67 65 72  centDirty(pPager
138d0 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35 29 3b  ->pPCache)>=25);
138e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
138f0 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
13900 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
13910 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
13920 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
13930 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
13940 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
13950 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
13960 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
13970 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
13980 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
13990 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
139a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
139b0 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
139c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
139d0 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
139e0 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
139f0 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
13a00 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
13a10 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
13a20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13a30 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
13a40 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
13a50 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
13a60 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
13a70 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
13a80 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
13a90 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
13aa0 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
13ab0 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
13ac0 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
13ad0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
13ae0 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
13af0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
13b00 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
13b10 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
13b20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
13b30 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
13b40 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
13b50 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
13b60 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
13b70 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
13b80 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
13b90 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
13ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
13bb0 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
13bc0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
13bd0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
13be0 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
13bf0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
13c00 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
13c10 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
13c20 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
13c30 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
13c40 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
13c50 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13c60 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13c70 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13c80 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
13c90 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
13ca0 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
13cb0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
13cc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13cd0 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
13ce0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
13cf0 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
13d00 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
13d10 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
13d20 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
13d30 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13d40 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
13d50 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13d60 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13d70 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13d80 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
13d90 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13da0 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
13db0 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
13dc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13dd0 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
13de0 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
13df0 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
13e00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
13e10 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
13e20 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
13e30 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
13e40 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
13e50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13e60 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13e70 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13e80 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
13e90 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
13ea0 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
13eb0 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
13ec0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
13ed0 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
13ee0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
13ef0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
13f00 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
13f10 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
13f20 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
13f30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13f40 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
13f50 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13f60 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13f70 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13f80 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
13f90 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13fa0 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
13fb0 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
13fc0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13fd0 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
13fe0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
13ff0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
14000 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
14010 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
14020 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
14030 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
14040 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
14050 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
14060 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
14070 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
14080 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
14090 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
140a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
140b0 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
140c0 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
140d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
140e0 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
140f0 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
14100 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
14110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
14120 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
14130 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
14140 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
14150 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
14160 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
14170 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
14180 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
14190 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
141a0 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
141b0 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
141c0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
141d0 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
141e0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
141f0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
14200 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
14210 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
14220 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
14230 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
14240 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
14250 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
14260 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
14270 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
14280 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
14290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
142a0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
142b0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
142c0 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
142d0 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
142e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
142f0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
14300 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
14310 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
14320 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
14330 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
14340 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
14350 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
14360 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
14370 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
14380 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
14390 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
143a0 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
143b0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
143c0 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
143d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
143e0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
143f0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
14400 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
14410 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
14420 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
14430 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
14440 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
14450 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
14460 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
14470 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
14480 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
14490 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
144a0 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
144b0 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
144c0 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
144d0 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
144e0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
144f0 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
14500 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
14510 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
14520 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
14530 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
14540 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
14550 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
14560 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
14570 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
14580 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
14590 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
145a0 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
145b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
145c0 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
145d0 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
145e0 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
145f0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
14600 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
14610 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
14620 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
14630 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14640 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14650 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
14660 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
14670 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
14680 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
14690 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
146a0 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
146b0 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
146c0 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
146d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
146e0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
146f0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
14700 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
14710 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
14720 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
14730 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20 20 20 7c  rnal==0 .      |
14740 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
14750 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
14760 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
14770 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
14780 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b 0a 20 20  _ATOMIC).  );.  
14790 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
147a0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61  r->jfd) ){.    a
147b0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
147c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
147d0 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
147e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
147f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
14800 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
14810 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
14820 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61  d) ){.      /* a
14830 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
14840 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14850 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
14860 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20 20 20  MORY ); */.     
14870 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
14880 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
14890 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
148a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
148b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
148c0 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20  DE_TRUNCATE ){. 
148d0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
148e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
148f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
14900 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
14910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14920 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
14930 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
14940 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  d, 0);.        i
14950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14960 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c   && pPager->full
14970 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
14980 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
14990 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69 7a 65  he new file size
149a0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
149b0 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67 68 74   the inode right
149c0 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20 20 20   away..         
149d0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68   ** Otherwise th
149e0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
149f0 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77  resurrect follow
14a00 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  ing a power loss
14a10 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
14a20 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61 73 74  * cause the last
14a30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
14a40 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a  roll back.  See.
14a50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 74 74            ** htt
14a60 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f  ps://bugzilla.mo
14a70 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62  zilla.org/show_b
14a80 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32 37 37  ug.cgi?id=107277
14a90 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  3.          */. 
14aa0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
14ab0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
14ac0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
14ad0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
14ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14af0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
14b00 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
14b10 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
14b20 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14b30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14b40 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
14b50 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
14b60 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
14b70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14b80 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
14b90 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a  ODE_WAL).    ){.
14ba0 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a        rc = zeroJ
14bb0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
14bc0 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c 70 50 61  , hasMaster||pPa
14bd0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
14be0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14bf0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
14c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
14c10 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
14c20 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
14c30 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
14c40 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
14c50 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
14c60 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
14c70 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
14c80 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
14c90 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
14ca0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
14cb0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
14cc0 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
14cd0 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
14ce0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
14cf0 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
14d00 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
14d10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
14d20 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nal..      */.  
14d30 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20      int bDelete 
14d40 3d 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  = !pPager->tempF
14d50 69 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ile;.      asser
14d60 74 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  t( sqlite3Journa
14d70 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
14d80 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a 20  er->jfd)==0 );. 
14d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14da0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14db0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14dc0 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
14dd0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
14de0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14df0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14e00 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20  _MEMORY .       
14e10 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
14e20 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14e30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
14e40 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
14e50 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14e60 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
14e70 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65       if( bDelete
14e80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14e90 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
14ea0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
14eb0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
14ec0 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
14ed0 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
14ee0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
14ef0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
14f00 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  S.  sqlite3Pcach
14f10 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
14f20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
14f30 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
14f40 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
14f50 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73  ->dbSize==0 && s
14f60 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
14f70 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
14f80 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50  ache)>0 ){.    P
14f90 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  gHdr *p = sqlite
14fa0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
14fb0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
14fc0 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
14fd0 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
14fe0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
14ff0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a  nrefNotNull(p);.
15000 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15010 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
15020 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
15030 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
15040 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
15050 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  al = 0;.  pPager
15060 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
15070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15080 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  ){.    if( MEMDB
15090 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68 4f 6e   || pagerFlushOn
150a0 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c 20 62  Commit(pPager, b
150b0 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 20  Commit) ){.     
150c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
150d0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
150e0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c  PCache);.    }el
150f0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
15100 33 50 63 61 63 68 65 43 6c 65 61 72 57 72 69 74  3PcacheClearWrit
15110 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70 50 43  able(pPager->pPC
15120 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ache);.    }.   
15130 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
15140 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
15150 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
15160 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  dbSize);.  }..  
15170 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
15180 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
15190 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77  * Drop the WAL w
151a0 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e  rite-lock, if an
151b0 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  y. Also, if the 
151c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69  connection was i
151d0 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e  n .    ** lockin
151e0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
151f0 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20   mode but is no 
15200 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65  longer, drop the
15210 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20   EXCLUSIVE .    
15220 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ** lock held on 
15230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15240 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
15250 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  2 = sqlite3WalEn
15260 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  dWriteTransactio
15270 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
15280 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32  .    assert( rc2
15290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
152a0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
152b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
152c0 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e 64  mit && pPager->d
152d0 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65 72  bFileSize>pPager
152e0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
152f0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
15300 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d  s taken when com
15310 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
15320 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63  ction in rollbac
15330 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  k-journal.    **
15340 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61 74   mode if the dat
15350 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
15360 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  sk is larger tha
15370 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
15380 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20  mage..    ** At 
15390 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 6a  this point the j
153a0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
153b0 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74 68  finalized and th
153c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
153d0 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
153e0 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75  ly committed, bu
153f0 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  t the EXCLUSIVE 
15400 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68 65  lock is still he
15410 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ld on the.    **
15420 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73 20   file. So it is 
15430 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74 65  safe to truncate
15440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15450 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  le to its minimu
15460 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  m.    ** require
15470 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20  d size.  */.    
15480 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15490 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
154a0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  _LOCK );.    rc 
154b0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
154c0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
154d0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
154e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
154f0 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
15500 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
15510 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  fd) ){.    rc = 
15520 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
15530 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
15540 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f   SQLITE_FCNTL_CO
15550 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20 30  MMIT_PHASETWO, 0
15560 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15570 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
15580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15590 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
155a0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
155b0 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65  de .   && (!page
155c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
155d0 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  || sqlite3WalExc
155e0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
155f0 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29  r->pWal, 0)).  )
15600 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  {.    rc2 = page
15610 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
15620 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
15630 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
15640 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
15650 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65  .  }.  pPager->e
15660 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
15670 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ADER;.  pPager->
15680 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  setMaster = 0;..
15690 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
156a0 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
156b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
156c0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
156d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
156e0 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
156f0 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
15700 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
15710 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
15720 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
15730 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15740 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  e, do not attemp
15750 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  t .** the rollba
15760 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ck at this time.
15770 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f   Instead, pager_
15780 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c  unlock() is call
15790 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20  ed. The.** call 
157a0 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
157b0 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61  ) will discard a
157c0 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
157d0 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68  es, unlock.** th
157e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
157f0 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67  and move the pag
15800 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  er back to OPEN 
15810 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a  state. If this .
15820 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
15830 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75  ere is a hot-jou
15840 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65  rnal left in the
15850 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
15860 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65  e next .** conne
15870 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
15880 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
15890 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63   the pager (whic
158a0 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e  h may be this on
158b0 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c  e) .** will roll
158c0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
158d0 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
158e0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
158f0 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
15900 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
15910 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
15920 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
15930 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
15940 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
15950 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
15960 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
15970 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
15980 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
15990 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
159a0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
159b0 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
159c0 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
159d0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
159e0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
159f0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
15a00 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15a10 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
15a20 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e  RROR && pPager->
15a30 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
15a40 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EN ){.    assert
15a50 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
15a60 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
15a70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15a80 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15a90 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
15aa0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
15ab0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
15ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
15ad0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
15ae0 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
15af0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
15b00 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  c();.    }else i
15b10 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
15b20 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
15b30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15b40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
15b50 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20  _READER );.     
15b60 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
15b70 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
15b80 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
15b90 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
15ba0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
15bb0 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
15bc0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
15bd0 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
15be0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
15bf0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
15c00 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
15c10 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
15c20 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
15c30 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
15c40 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
15c50 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15c60 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
15c70 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
15c80 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
15c90 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
15ca0 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
15cb0 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
15cc0 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
15cd0 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
15ce0 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
15cf0 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
15d00 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
15d10 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
15d20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
15d30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
15d40 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
15d50 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
15d60 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
15d70 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
15d80 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
15d90 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
15da0 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
15db0 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
15dc0 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
15dd0 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
15de0 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
15df0 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
15e00 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
15e10 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
15e20 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
15e30 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
15e40 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
15e50 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
15e60 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
15e70 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
15e80 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
15e90 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
15ea0 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
15eb0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
15ec0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
15ed0 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
15ee0 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
15ef0 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
15f00 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
15f10 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
15f20 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
15f30 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
15f40 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
15f50 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
15f60 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
15f70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15f80 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
15f90 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
15fa0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
15fb0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
15fc0 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
15fd0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
15fe0 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
15ff0 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
16000 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
16010 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
16020 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
16030 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
16040 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
16050 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
16060 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
16070 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
16080 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
16090 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
160a0 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
160b0 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
160c0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
160d0 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
160e0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
160f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
16100 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
16110 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
16120 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
16130 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
16140 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
16150 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
16180 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
16190 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
161a0 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
161b0 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
161c0 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
161d0 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
161e0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
161f0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16200 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  DEC./*.** Make s
16210 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
16220 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20  f reserved bits 
16230 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20 74  is the same in t
16240 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a  he destination.*
16250 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69 73  * pager as it is
16260 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e 20   in the source. 
16270 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20 77   This comes up w
16280 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68 61  hen a VACUUM cha
16290 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  nges the.** numb
162a0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
162b0 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74 69  its to the "opti
162c0 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a  mal" amount..*/.
162d0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
162e0 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50 61  rAlignReserve(Pa
162f0 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67 65  ger *pDest, Page
16300 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28 20  r *pSrc){.  if( 
16310 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 21  pDest->nReserve!
16320 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 20  =pSrc->nReserve 
16330 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 52  ){.    pDest->nR
16340 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e  eserve = pSrc->n
16350 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
16360 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44 65  erReportSize(pDe
16370 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  st);.  }.}.#endi
16380 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
16390 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
163a0 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
163b0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
163c0 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
163d0 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
163e0 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
163f0 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
16400 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
16410 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
16420 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
16430 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
16440 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
16450 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
16460 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
16470 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
16480 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
16490 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
164a0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
164b0 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
164c0 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
164d0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
164e0 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
164f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
16500 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
16510 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
16520 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
16530 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
16540 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
16550 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
16560 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
16570 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
16580 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
16590 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
165a0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
165b0 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
165c0 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
165d0 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
165e0 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
165f0 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
16600 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
16610 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
16620 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
16630 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
16640 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
16650 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
16660 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
16670 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
16680 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16690 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
166a0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
166b0 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
166c0 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
166d0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
166e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
166f0 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
16700 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
16710 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16720 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
16730 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
16740 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16750 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
16760 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
16770 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
16780 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
16790 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
167a0 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
167b0 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
167c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
167d0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
167e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
167f0 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
16800 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
16810 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16820 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
16830 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
16840 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
16850 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
16860 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
16870 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
16880 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
16890 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
168a0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
168b0 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
168c0 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
168d0 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
168e0 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
168f0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
16900 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
16910 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
16920 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
16930 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
16940 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
16950 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
16960 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
16970 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
16980 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
16990 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
169a0 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
169b0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
169c0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
169d0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
169e0 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
169f0 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
16a00 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
16a10 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
16a20 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
16a30 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
16a40 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
16a50 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
16a60 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
16a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16a80 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
16a90 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
16aa0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16ac0 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
16ad0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
16ae0 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
16af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
16b00 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
16b10 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
16b20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b40 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
16b50 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
16b60 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
16b70 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
16b80 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
16b90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
16ba0 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
16bb0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
16bc0 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
16bd0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
16be0 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16bf0 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
16c00 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
16c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16c20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
16c30 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
16c40 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
16c50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
16c60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16c70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
16c80 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
16c90 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cb0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
16cc0 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
16cd0 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
16ce0 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
16cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
16d00 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
16d10 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
16d20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16d30 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
16d40 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
16d50 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
16d60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
16d70 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d90 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
16da0 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
16db0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
16dc0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a  E_HAS_CODEC.  /*
16dd0 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61   The jrnlEnc fla
16de0 67 20 69 73 20 74 72 75 65 20 69 66 20 4a 6f 75  g is true if Jou
16df0 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f 75 6c  rnal pages shoul
16e00 64 20 62 65 20 70 61 73 73 65 64 20 74 68 72 6f  d be passed thro
16e10 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64  ugh.  ** the cod
16e20 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c 73 65  ec.  It is false
16e30 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d   for pure in-mem
16e40 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ory journals. */
16e50 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e  .  const int jrn
16e60 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72  lEnc = (isMainJr
16e70 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  nl || pPager->su
16e80 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a  bjInMemory==0);.
16e90 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
16ea0 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
16eb0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
16ec0 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
16ed0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
16ee0 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
16ef0 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
16f00 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
16f10 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
16f20 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
16f30 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
16f40 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
16f50 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
16f60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
16f70 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
16f80 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
16f90 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
16fa0 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
16fb0 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
16fc0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
16fd0 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
16fe0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
16ff0 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
17000 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
17010 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
17020 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
17030 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
17040 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
17050 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
17060 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65  .  /* Either the
17070 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65   state is greate
17080 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49  r than PAGER_WRI
17090 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20  TER_CACHEMOD (a 
170a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
170b0 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  * or savepoint r
170c0 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20  ollback done at 
170d0 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74  the request of t
170e0 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68  he caller) or th
170f0 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74  is is.  ** a hot
17100 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
17110 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f  k. If it is a ho
17120 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
17130 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20  ck, the pager.  
17140 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f  ** is in state O
17150 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e  PEN and holds an
17160 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
17170 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot-journal rol
17180 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20  lback.  ** only 
17190 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  reads from the m
171a0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  ain journal, not
171b0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
171c0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
171d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
171e0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
171f0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
17200 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
17210 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
17220 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
17230 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
17240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17250 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17260 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17270 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e  MOD || isMainJrn
17280 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  l );..  /* Read 
17290 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
172a0 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
172b0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
172c0 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
172d0 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
172e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
172f0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
17300 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
17310 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
17320 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
17330 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
17340 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
17350 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
17360 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
17370 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17380 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17390 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
173a0 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
173b0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
173c0 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
173d0 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
173e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
173f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
17400 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
17410 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
17420 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
17430 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
17440 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
17450 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
17460 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
17470 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
17480 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
17490 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
174a0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
174b0 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
174c0 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
174d0 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
174e0 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
174f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
17500 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
17510 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
17520 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
17530 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
17540 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
17550 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
17560 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
17570 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
17580 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
17590 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
175a0 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
175b0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
175c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
175d0 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
175e0 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
175f0 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
17600 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
17610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17620 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
17630 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
17640 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17650 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
17660 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
17670 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17680 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
17690 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
176a0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
176b0 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
176c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
176d0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
176e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
176f0 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  s page has alrea
17700 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
17710 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e  ack before durin
17720 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
17730 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
17740 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
17750 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
17760 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
17770 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
17780 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
17790 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
177a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
177b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
177c0 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
177d0 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
177e0 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
177f0 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
17800 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
17810 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
17820 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
17830 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
17840 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
17850 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
17860 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
17870 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
17880 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
17890 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
178a0 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
178b0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
178c0 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
178d0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
178e0 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
178f0 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
17900 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
17910 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
17920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17930 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
17940 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
17950 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
17960 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
17970 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
17980 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
17990 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
179a0 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
179b0 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
179c0 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
179d0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
179e0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
179f0 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
17a00 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
17a10 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
17a20 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
17a30 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
17a40 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
17a50 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
17a60 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
17a70 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
17a80 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
17a90 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
17aa0 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
17ab0 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
17ac0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
17ad0 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
17ae0 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
17af0 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
17b00 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
17b10 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
17b20 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
17b30 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
17b40 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
17b50 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
17b60 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
17b70 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
17b80 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
17b90 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
17ba0 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
17bb0 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
17bc0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
17bd0 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
17be0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
17bf0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
17c00 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
17c10 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
17c20 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
17c30 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
17c40 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
17c50 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
17c60 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
17c70 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
17c80 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
17c90 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
17ca0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17cb0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17cc0 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
17cd0 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
17ce0 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
17cf0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
17d00 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
17d10 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
17d20 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
17d30 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
17d40 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
17d50 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
17d60 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
17d70 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
17d80 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
17d90 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
17da0 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
17db0 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
17dc0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
17dd0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
17de0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
17df0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
17e00 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
17e10 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
17e20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
17e30 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
17e40 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
17e50 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
17e60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
17e70 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
17e80 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
17e90 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
17ea0 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
17eb0 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
17ec0 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
17ed0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
17ee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
17ef0 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
17f00 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
17f10 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
17f20 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
17f30 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
17f40 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
17f50 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
17f60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
17f70 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
17f80 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
17f90 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
17fa0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
17fb0 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
17fc0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
17fd0 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
17fe0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
17ff0 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
18000 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
18010 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
18020 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
18030 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
18040 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
18050 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
18060 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
18070 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
18080 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
18090 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
180a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
180b0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
180c0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
180d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
180e0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
180f0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
18100 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
18110 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
18120 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
18130 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
18140 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
18150 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
18160 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41 47  empFile );.  PAG
18170 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
18180 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
18190 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
181a0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
181b0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
181c0 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
181d0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
181e0 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
181f0 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
18200 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
18210 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
18220 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
18230 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
18240 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
18250 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
18260 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
18270 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
18280 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
18290 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
182a0 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
182b0 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
182c0 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
182d0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
182e0 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61  ->fd).   && (pPa
182f0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
18300 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
18310 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
18320 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
18330 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
18340 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
18350 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
18360 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18370 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
18380 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
18390 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
183a0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
183b0 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  YNC)!=0 );.    a
183c0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
183d0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
183e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
183f0 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d 20   data read from 
18400 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
18410 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18420 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  se file..    ** 
18430 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
18440 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20 61 6e  safe even for an
18450 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
18460 61 73 65 20 2d 20 61 73 20 74 68 65 20 64 61 74  ase - as the dat
18470 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 63  a.    ** was enc
18480 72 79 70 74 65 64 20 62 65 66 6f 72 65 20 69 74  rypted before it
18490 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
184a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
184b0 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
184c0 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 65      ** is if the
184d0 20 64 61 74 61 20 77 61 73 20 6a 75 73 74 20 72   data was just r
184e0 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d  ead from an in-m
184f0 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
18500 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20 20 2a  l. In that.    *
18510 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74 20 62  * case it must b
18520 65 20 65 6e 63 72 79 70 74 65 64 20 68 65 72 65  e encrypted here
18530 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63 6f   before it is co
18540 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61  pied into the da
18550 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
18560 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  le.  */.#ifdef S
18570 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18580 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63      if( !jrnlEnc
18590 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 32   ){.      CODEC2
185a0 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
185b0 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
185c0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61  TE_NOMEM_BKPT, a
185d0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63 20  Data);.      rc 
185e0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
185f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
18600 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
18610 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
18620 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
18630 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
18640 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18650 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
18660 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
18670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18680 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
18690 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
186a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
186b0 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69  e, ofst);..    i
186c0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
186d0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
186e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
186f0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
18700 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18710 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
18720 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
18730 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 69 66  S_CODEC.      if
18740 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20  ( jrnlEnc ){.   
18750 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
18760 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
18770 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
18780 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20  MEM_BKPT);.     
18790 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
187a0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
187b0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
187c0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
187d0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
187e0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
187f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18800 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20  M_BKPT,aData);. 
18810 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
18820 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  f.      sqlite3B
18830 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
18840 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
18850 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
18860 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18870 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
18880 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
18890 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
188a0 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
188b0 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
188c0 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
188d0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
188e0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
188f0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
18900 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
18910 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
18920 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
18930 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
18940 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
18950 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
18960 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
18970 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
18980 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
18990 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
189a0 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
189b0 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
189c0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
189d0 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
189e0 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
189f0 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
18a00 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
18a10 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
18a20 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
18a30 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
18a40 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
18a50 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
18a60 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
18a70 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
18a80 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
18a90 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
18aa0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
18ab0 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
18ac0 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
18ad0 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
18ae0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
18af0 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
18b00 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
18b10 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
18b20 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
18b30 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
18b40 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
18b50 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
18b60 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
18b70 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
18b80 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
18b90 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
18ba0 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
18bb0 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
18bc0 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
18bd0 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
18be0 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
18bf0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
18c00 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
18c10 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
18c20 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18c30 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18c40 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ACK)==0 );.    p
18c50 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18c60 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52  l |= SPILLFLAG_R
18c70 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20  OLLBACK;.    rc 
18c80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
18c90 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
18ca0 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
18cb0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
18cc0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
18cd0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
18ce0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
18cf0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
18d00 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
18d10 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
18d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18d30 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
18d40 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
18d50 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
18d60 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
18d70 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
18d80 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
18d90 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
18da0 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
18db0 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
18dc0 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
18dd0 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
18de0 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
18df0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
18e00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
18e10 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
18e20 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
18e30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
18e40 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
18e50 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
18e60 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
18e70 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
18e80 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
18e90 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
18ea0 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
18eb0 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
18ec0 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
18ed0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
18ee0 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
18ef0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
18f00 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
18f10 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
18f20 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73 65  );.    /* It use
18f30 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71 6c  d to be that sql
18f40 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
18f50 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61 6c  ean(pPg) was cal
18f60 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a 20  led here.  But. 
18f70 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20     ** that call 
18f80 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61 6e  was dangerous an
18f90 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74 61  d had no detecta
18fa0 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e 63  ble benefit sinc
18fb0 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20 20  e the cache.    
18fc0 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  ** is normally c
18fd0 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74 65  leaned by sqlite
18fe0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
18ff0 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  ) after rollback
19000 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68   and so.    ** h
19010 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  as been removed.
19020 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73 65   */.    pager_se
19030 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
19040 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
19050 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
19060 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
19070 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
19080 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
19090 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
190a0 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
190b0 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
190c0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
190d0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
190e0 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
190f0 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
19100 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
19110 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
19120 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
19130 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
19140 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c   disk */.#if SQL
19150 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
19160 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b    if( jrnlEnc ){
19170 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
19180 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
19190 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
191a0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65  OMEM_BKPT); }.#e
191b0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
191c0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
191d0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
191e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
191f0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
19200 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
19210 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19220 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
19230 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
19240 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
19250 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19260 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
19270 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
19280 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
19290 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
192a0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
192b0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
192c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
192d0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
192e0 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
192f0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
19300 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
19310 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
19320 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
19330 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
19340 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
19350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
19360 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
19370 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19380 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
19390 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
193a0 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
193b0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
193c0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
193d0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
193e0 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
193f0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
19400 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
19410 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
19420 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
19430 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
19440 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
19450 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
19460 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
19470 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
19480 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
19490 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
194a0 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
194b0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
194c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
194d0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
194e0 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
194f0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
19500 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
19510 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
19520 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
19530 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
19540 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
19550 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
19560 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19570 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19580 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
19590 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
195a0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
195b0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
195c0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
195d0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
195e0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
195f0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
19600 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
19610 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
19620 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
19630 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
19640 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
19650 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
19660 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
19670 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
19680 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
19690 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
196a0 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
196b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
196c0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
196d0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
196e0 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
196f0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
19700 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
19710 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
19720 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
19730 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
19740 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
19750 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
19760 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
19770 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
19780 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
19790 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
197a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
197b0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
197c0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
197d0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
197e0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
197f0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19800 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
19810 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
19820 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
19830 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
19840 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
19850 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19860 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
19870 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
19880 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
19890 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
198a0 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
198b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
198c0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
198d0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
198e0 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
198f0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
19900 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19910 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
19920 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
19930 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
19940 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
19950 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
19960 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
19970 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
19980 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
19990 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
199a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
199b0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
199c0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
199d0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
199e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
199f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19a00 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
19a10 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
19a20 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
19a30 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19a40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19a50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
19a60 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
19a70 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
19a80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
19a90 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
19aa0 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
19ab0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
19ac0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
19ad0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19ae0 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
19af0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
19b00 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
19b10 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
19b20 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
19b30 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
19b40 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
19b50 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
19b60 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
19b70 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
19b80 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
19b90 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
19ba0 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
19bb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
19bc0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
19bd0 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
19be0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
19bf0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
19c00 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
19c10 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
19c20 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
19c30 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
19c40 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
19c50 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
19c60 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
19c70 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
19c80 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
19c90 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
19ca0 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
19cb0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
19cc0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
19cd0 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
19ce0 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
19cf0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
19d00 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
19d10 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
19d20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19d30 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
19d40 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
19d50 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
19d60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
19d70 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
19d80 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
19d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19da0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
19db0 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
19dc0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
19dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19de0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19df0 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
19e00 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
19e10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19e20 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
19e30 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
19e40 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
19e50 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
19e60 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
19e70 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
19e80 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
19e90 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
19ea0 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
19eb0 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
19ec0 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
19ed0 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
19ee0 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
19ef0 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
19f00 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
19f10 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
19f20 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
19f30 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
19f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19f50 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19f60 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
19f70 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
19f80 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
19f90 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
19fa0 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
19fb0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
19fc0 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
19fd0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
19fe0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19ff0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1a000 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a010 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
1a020 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
1a030 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
1a040 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
1a050 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1a060 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
1a070 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
1a080 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
1a090 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a0a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
1a0b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
1a0c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
1a0d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
1a0e0 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
1a0f0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
1a100 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
1a110 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
1a120 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
1a130 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
1a140 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
1a150 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1a160 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
1a170 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1a180 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
1a190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a1a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1a1b0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a1c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a1d0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
1a1e0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
1a1f0 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
1a200 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
1a210 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
1a220 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
1a230 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
1a240 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
1a250 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
1a260 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
1a270 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
1a280 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
1a290 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
1a2a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1a2b0 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
1a2c0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
1a2d0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
1a2e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1a2f0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
1a300 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1a310 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
1a320 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
1a330 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
1a340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a350 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
1a360 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a370 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
1a380 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1a390 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
1a3a0 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
1a3b0 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
1a3c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
1a3d0 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
1a3e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a3f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
1a400 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a410 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
1a420 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
1a430 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
1a440 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
1a450 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
1a460 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
1a470 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
1a480 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
1a490 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a4a0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
1a4b0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a4c0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1a4d0 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
1a4e0 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
1a4f0 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
1a500 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
1a510 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
1a520 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
1a530 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
1a540 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
1a550 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
1a560 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
1a570 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
1a580 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
1a590 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
1a5a0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
1a5b0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
1a5c0 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
1a5d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
1a5e0 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
1a5f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1a600 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a610 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
1a620 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
1a630 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1a640 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
1a650 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
1a660 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1a670 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
1a680 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
1a690 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
1a6a0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1a6b0 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
1a6c0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
1a6d0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
1a6e0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
1a6f0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1a700 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
1a710 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
1a720 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
1a730 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
1a740 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1a750 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
1a760 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
1a770 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
1a780 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
1a790 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
1a7a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1a7b0 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
1a7c0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
1a7d0 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
1a7e0 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
1a7f0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
1a800 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
1a810 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
1a820 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
1a830 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  Or, it might be 
1a840 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
1a850 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1a860 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
1a870 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
1a880 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
1a890 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
1a8a0 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
1a8b0 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
1a8c0 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
1a8d0 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
1a8e0 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
1a8f0 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
1a900 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
1a910 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
1a920 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
1a930 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
1a940 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
1a950 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
1a960 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
1a970 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1a980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
1a990 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1a9a0 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
1a9b0 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
1a9c0 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
1a9d0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
1a9e0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1a9f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1aa00 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
1aa10 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1aa20 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
1aa30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1aa40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1aa50 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
1aa60 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
1aa70 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1aa80 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
1aa90 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
1aaa0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
1aab0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1aac0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1aad0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1aae0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1aaf0 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
1ab00 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
1ab10 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
1ab20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
1ab30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1ab40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1ab50 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
1ab60 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
1ab70 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
1ab80 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
1ab90 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
1aba0 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
1abb0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1abc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
1abd0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
1abe0 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a  ewSize = szPage*
1abf0 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
1ac00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ac10 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
1ac20 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
1ac30 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
1ac40 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
1ac50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ac60 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1ac70 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
1ac80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1ac90 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
1aca0 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
1acb0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1acc0 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
1acd0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1ace0 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
1acf0 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
1ad00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1ad10 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
1ad20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
1ad30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1ad40 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
1ad50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
1ad60 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
1ad70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1ad80 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1ad90 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
1ada0 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
1adb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1adc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1add0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1ade0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
1adf0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
1ae00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ae10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1ae20 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
1ae30 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1ae40 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
1ae50 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
1ae60 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1ae70 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1ae80 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
1ae90 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
1aea0 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
1aeb0 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
1aec0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1aed0 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
1aee0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
1aef0 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
1af00 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
1af10 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
1af20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
1af30 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1af40 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
1af50 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
1af60 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
1af70 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
1af80 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
1af90 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
1afa0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1afb0 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
1afc0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
1afd0 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
1afe0 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
1aff0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1b000 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1b010 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
1b020 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1b030 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
1b040 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1b050 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
1b060 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1b070 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
1b080 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b090 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
1b0a0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
1b0b0 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
1b0c0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1b0d0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
1b0e0 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
1b0f0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1b100 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
1b110 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
1b120 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
1b130 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1b140 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b150 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
1b160 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1b170 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1b180 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
1b190 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
1b1a0 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
1b1b0 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
1b1c0 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
1b1d0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
1b1e0 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
1b1f0 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
1b200 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
1b210 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
1b220 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
1b230 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b240 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
1b250 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
1b260 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1b270 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
1b280 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
1b290 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
1b2a0 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
1b2b0 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
1b2c0 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
1b2d0 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
1b2e0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1b2f0 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
1b300 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
1b310 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
1b320 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
1b330 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
1b340 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1b350 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
1b360 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
1b370 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
1b380 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b390 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
1b3a0 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
1b3b0 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
1b3c0 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
1b3d0 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
1b3e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1b3f0 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
1b400 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
1b410 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1b420 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
1b430 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
1b440 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
1b450 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
1b460 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
1b470 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1b480 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1b490 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
1b4a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1b4b0 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
1b4c0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1b4d0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1b4e0 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
1b4f0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1b500 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1b510 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
1b520 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
1b530 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
1b540 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1b550 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
1b560 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
1b570 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
1b580 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
1b590 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
1b5a0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
1b5b0 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
1b5c0 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
1b5d0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b5e0 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
1b5f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1b600 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
1b610 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1b620 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r->fd);.  }.}../
1b630 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
1b640 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
1b650 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
1b660 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
1b670 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
1b680 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
1b690 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
1b6a0 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
1b6b0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b6c0 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
1b6d0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
1b6e0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
1b6f0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
1b700 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
1b710 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
1b720 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1b730 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b740 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
1b750 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
1b760 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
1b770 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
1b780 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1b790 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
1b7a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
1b7b0 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
1b7c0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
1b7d0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
1b7e0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
1b7f0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1b800 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
1b810 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
1b820 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
1b830 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
1b840 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
1b850 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b860 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1b870 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
1b880 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
1b890 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
1b8a0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
1b8b0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1b8c0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1b8d0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
1b8e0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
1b8f0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
1b900 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
1b910 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
1b920 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1b930 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1b940 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
1b950 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
1b960 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
1b970 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
1b980 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
1b990 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
1b9a0 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
1b9b0 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
1b9c0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1b9d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
1b9e0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
1b9f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1ba00 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
1ba10 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1ba20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
1ba30 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
1ba40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1ba50 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
1ba60 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
1ba70 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
1ba80 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
1ba90 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
1baa0 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
1bab0 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
1bac0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
1bad0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
1bae0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
1baf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1bb00 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
1bb10 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1bb20 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
1bb30 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
1bb40 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
1bb50 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
1bb60 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1bb70 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
1bb80 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
1bb90 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
1bba0 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
1bbb0 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
1bbc0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
1bbd0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
1bbe0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1bbf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1bc00 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
1bc10 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
1bc20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
1bc30 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
1bc40 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
1bc50 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
1bc60 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
1bc70 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
1bc80 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
1bc90 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
1bca0 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
1bcb0 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
1bcc0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
1bcd0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1bce0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1bcf0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
1bd00 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1bd10 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
1bd20 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
1bd30 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
1bd40 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
1bd50 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
1bd60 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
1bd70 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
1bd80 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
1bd90 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
1bda0 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
1bdb0 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
1bdc0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
1bdd0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
1bde0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
1bdf0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1be00 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
1be10 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
1be20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
1be30 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
1be40 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
1be50 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1be60 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
1be70 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
1be80 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
1be90 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
1bea0 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
1beb0 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
1bec0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
1bed0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
1bee0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
1bef0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1bf00 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
1bf10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1bf20 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
1bf30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1bf40 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
1bf50 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
1bf60 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
1bf70 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
1bf80 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
1bf90 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1bfa0 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
1bfb0 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
1bfc0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
1bfd0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1bfe0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
1bff0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
1c000 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1c010 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1c020 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
1c030 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
1c040 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
1c050 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
1c060 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
1c070 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
1c080 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
1c090 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
1c0a0 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
1c0b0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
1c0c0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c0d0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
1c0e0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
1c0f0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
1c100 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
1c110 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
1c120 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
1c130 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
1c140 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
1c150 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
1c160 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
1c170 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1c180 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
1c190 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c1a0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1c1b0 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c1d0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
1c1e0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
1c1f0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
1c220 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
1c230 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1c260 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1c270 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
1c280 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c290 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1c2a0 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
1c2b0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c2d0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
1c2e0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1c2f0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
1c300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1c310 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1c320 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1c330 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1c340 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1c350 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
1c360 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1c370 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
1c380 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
1c390 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
1c3a0 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
1c3b0 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
1c3c0 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e  lback */.  int n
1c3d0 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20  Playback = 0;   
1c3e0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1c3f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73  ber of pages res
1c400 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e  tored from journ
1c410 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  al */..  /* Figu
1c420 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1c430 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1c440 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1c450 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1c460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1c470 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1c480 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1c490 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1c4a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1c4b0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1c4c0 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1c4d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c4e0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1c4f0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1c500 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1c510 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1c520 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1c530 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1c540 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1c550 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1c560 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1c570 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1c580 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1c590 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1c5a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1c5b0 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1c5c0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1c5d0 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1c5e0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1c5f0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1c600 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1c610 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1c620 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1c630 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1c640 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1c650 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1c660 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1c670 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1c680 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1c690 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1c6a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1c6b0 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1c6c0 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61  c,.  ** mxPathna
1c6d0 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1c6e0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1c6f0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1c700 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1c710 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1c720 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1c730 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1c740 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1c750 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1c760 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1c770 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1c780 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1c790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c7a0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1c7b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1c7c0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1c7d0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1c7e0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1c7f0 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1c800 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1c810 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c820 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1c830 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c840 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1c850 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1c860 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1c870 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1c880 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1c890 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1c8a0 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1c8b0 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1c8c0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c8d0 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1c8e0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1c8f0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1c900 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1c910 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1c920 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1c930 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1c940 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1c950 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1c960 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1c970 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1c980 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1c990 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1c9a0 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1c9b0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1c9c0 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1c9d0 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1c9e0 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1c9f0 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1ca00 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1ca10 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1ca20 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1ca30 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1ca40 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1ca50 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1ca60 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1ca70 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1ca80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ca90 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1caa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1cab0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cad0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1cae0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1caf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1cb00 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1cb10 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1cb20 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1cb30 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1cb40 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1cb50 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1cb60 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1cb70 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1cb80 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1cb90 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1cba0 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1cbb0 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1cbc0 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1cbd0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1cbe0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1cbf0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1cc00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1cc10 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1cc20 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1cc30 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1cc40 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1cc50 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1cc60 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1cc70 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1cc80 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1cc90 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1cca0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1ccb0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1ccc0 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1ccd0 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1cce0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1ccf0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1cd00 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1cd10 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1cd20 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1cd30 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1cd40 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1cd50 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1cd60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1cd70 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1cd80 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1cd90 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1cda0 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1cdb0 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1cdc0 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1cdd0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1cde0 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1cdf0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1ce00 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1ce10 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1ce20 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1ce30 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1ce40 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1ce50 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1ce60 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1ce70 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1ce80 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1ce90 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1cea0 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1ceb0 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1cec0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1ced0 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1cee0 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1cef0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1cf00 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1cf10 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1cf20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1cf30 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1cf40 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1cf50 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1cf60 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1cf70 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1cf80 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1cf90 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1cfa0 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1cfb0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1cfc0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1cfd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1cfe0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1cff0 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1d000 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1d010 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1d020 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1d030 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1d040 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1d050 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1d060 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1d070 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1d080 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1d090 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1d0a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1d0b0 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1d0c0 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1d0d0 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1d0e0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1d0f0 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1d100 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1d110 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1d120 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1d130 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1d140 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1d150 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1d160 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1d170 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1d180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d190 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1d1a0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1d1b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d1c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d1d0 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1d1e0 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1d1f0 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1d200 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1d210 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1d220 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d230 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1d240 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1d250 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1d260 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1d270 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1d280 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1d290 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1d2a0 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1d2b0 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1d2c0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1d2d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1d2e0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1d2f0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1d300 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1d310 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d320 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1d330 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1d340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d350 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d360 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1d370 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1d380 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1d390 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d3a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1d3b0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1d3c0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1d3d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d3e0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1d3f0 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1d400 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1d410 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1d420 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1d430 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1d440 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1d450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1d460 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1d470 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1d480 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1d490 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1d4a0 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1d4b0 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1d4c0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1d4d0 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1d4e0 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1d4f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1d500 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1d510 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1d520 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1d530 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1d540 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d550 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1d560 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1d570 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d580 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1d590 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1d5a0 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1d5b0 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1d5c0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1d5d0 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1d5e0 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1d5f0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1d600 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1d610 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1d620 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1d630 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1d640 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1d650 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1d660 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1d670 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1d680 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1d690 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1d6a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1d6b0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d6c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1d6d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1d6e0 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1d6f0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1d700 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1d710 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1d720 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1d730 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1d740 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1d750 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1d760 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1d770 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1d780 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1d790 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1d7a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1d7b0 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1d7c0 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1d7d0 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1d7e0 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1d7f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d800 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1d810 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  fied..  */.#ifde
1d820 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d830 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
1d840 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1d850 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1d860 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
1d870 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1d880 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1d890 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1d8a0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1d8b0 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1d8c0 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1d8d0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1d8e0 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1d8f0 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1d900 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1d910 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1d920 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1d930 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1d940 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1d950 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1d960 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1d970 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1d980 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1d990 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1d9a0 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1d9b0 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1d9c0 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1d9d0 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1d9e0 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1d9f0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1da00 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1da10 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1da20 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1da30 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1da40 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1da50 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1da60 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1da70 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1da80 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1da90 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1daa0 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1dab0 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1dac0 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1dad0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1dae0 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1daf0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1db00 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1db10 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1db20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db30 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1db40 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1db50 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1db60 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1db70 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1db80 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1db90 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1dba0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1dbb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dbc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1dbd0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1dbe0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1dbf0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1dc00 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1dc10 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1dc20 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  N).  ){.    rc =
1dc30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1dc40 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
1dc50 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1dc60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1dc70 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1dc80 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1dc90 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1dca0 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61  , 0);.    testca
1dcb0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1dcc0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1dcd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dce0 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
1dcf0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
1dd00 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
1dd10 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
1dd20 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1dd30 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
1dd40 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1dd50 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1dd60 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1dd70 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
1dd80 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
1dd90 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
1dda0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1ddb0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1ddc0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1ddd0 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e    if( isHot && n
1dde0 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20  Playback ){.    
1ddf0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1de00 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
1de10 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63  R_ROLLBACK, "rec
1de20 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20  overed %d pages 
1de30 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20  from %s",.      
1de40 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62            nPlayb
1de50 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ack, pPager->zJo
1de60 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  urnal);.  }..  /
1de70 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1de80 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1de90 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1dea0 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1deb0 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1dec0 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1ded0 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1dee0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1def0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1df00 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1df10 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1df20 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1df30 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1df40 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1df50 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1df60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1df70 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1df80 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1df90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dfa0 65 20 28 6f 72 20 6f 75 74 20 6f 66 0a 2a 2a 20  e (or out of.** 
1dfb0 74 68 65 20 57 41 4c 20 69 66 20 74 68 61 74 20  the WAL if that 
1dfc0 69 73 20 77 68 65 72 65 20 74 68 65 20 6d 6f 73  is where the mos
1dfd0 74 20 72 65 63 65 6e 74 20 63 6f 70 79 20 69 66  t recent copy if
1dfe0 20 66 6f 75 6e 64 29 20 69 6e 74 6f 20 0a 2a 2a   found) into .**
1dff0 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1e000 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1e010 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1e020 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1e030 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1e040 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1e050 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1e060 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1e070 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1e080 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1e090 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1e0a0 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1e0b0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1e0c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1e0d0 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1e0e0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1e0f0 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1e100 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1e110 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1e120 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1e130 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1e140 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1e150 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
1e160 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1e170 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1e180 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e190 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e1a0 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 69   page pPg */.  i
1e1b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e1c0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
1e1d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e1e0 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20  u32 iFrame = 0; 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e200 46 72 61 6d 65 20 6f 66 20 57 41 4c 20 63 6f 6e  Frame of WAL con
1e210 74 61 69 6e 69 6e 67 20 70 67 6e 6f 20 2a 2f 0a  taining pgno */.
1e220 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e230 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1e240 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1e250 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1e260 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1e270 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65  ) );..  if( page
1e280 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1e290 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1e2a0 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
1e2b0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
1e2c0 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  g->pgno, &iFrame
1e2d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e2e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1e2f0 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1e300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1e310 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67  alReadFrame(pPag
1e320 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65  er->pWal, iFrame
1e330 2c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  ,pPager->pageSiz
1e340 65 2c 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e,pPg->pData);. 
1e350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1e360 69 4f 66 66 73 65 74 20 3d 20 28 70 50 67 2d 3e  iOffset = (pPg->
1e370 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1e380 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1e390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1e3a0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1e3b0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
1e3c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1e3d0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
1e3e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1e3f0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1e400 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e410 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1e420 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  ..  if( pPg->pgn
1e430 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1e440 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1e450 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1e460 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1e470 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1e480 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1e490 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1e4a0 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1e4b0 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1e4c0 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1e4d0 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1e4e0 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1e4f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e500 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1e510 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1e520 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1e530 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1e540 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1e550 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1e560 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1e570 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1e580 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1e590 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1e5a0 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1e5b0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1e5c0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1e5d0 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1e5e0 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1e5f0 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1e600 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1e610 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1e620 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1e630 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1e640 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1e650 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1e660 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1e670 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1e680 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1e690 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1e6a0 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20   noise equaling 
1e6b0 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
1e6c0 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
1e6d0 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
1e6e0 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
1e6f0 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
1e700 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
1e710 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e720 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
1e730 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e740 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
1e750 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
1e760 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
1e770 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
1e780 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1e790 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e7a0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1e7b0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1e7c0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1e7d0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1e7e0 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
1e7f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
1e800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1e810 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45  M_BKPT);..  PAGE
1e820 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1e830 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1e840 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1e850 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1e860 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1e870 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1e880 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  er, pPg->pgno));
1e890 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1e8a0 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1e8b0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1e8d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1e8e0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  pPg->pgno, pager
1e8f0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1e900 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1e910 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1e920 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1e930 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1e940 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e  at offsets 24 an
1e950 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68  d 92 in.** the h
1e960 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71  eader and the sq
1e970 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  lite version num
1e980 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
1e990 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1e9a0 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  an unconditional
1e9b0 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c   update.  See al
1e9c0 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63  so the pager_inc
1e9d0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1e9e0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69  ).** routine whi
1e9f0 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20  ch only updates 
1ea00 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1ea10 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65  er if the update
1ea20 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20   is actually.** 
1ea30 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72  needed, as deter
1ea40 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61  mined by the pPa
1ea50 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1ea60 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61  Done state varia
1ea70 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1ea80 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f  oid pager_write_
1ea90 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67  changecounter(Pg
1eaa0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32  Hdr *pPg){.  u32
1eab0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1eac0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1ead0 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1eae0 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1eaf0 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1eb00 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
1eb10 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1eb20 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
1eb30 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  g->pPager->dbFil
1eb40 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33  eVers)+1;.  put3
1eb50 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1eb60 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  g->pData)+24, ch
1eb70 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
1eb80 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
1eb90 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
1eba0 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
1ebb0 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
1ebc0 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e  .  ** bytes 92..
1ebd0 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61  95 store the cha
1ebe0 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge counter for 
1ebf0 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f  which the versio
1ec00 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73  n number.  ** is
1ec10 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74   valid. */.  put
1ec20 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1ec30 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63  Pg->pData)+92, c
1ec40 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1ec50 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1ec60 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1ec70 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
1ec80 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23  ON_NUMBER);.}..#
1ec90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1eca0 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_WAL./*.** Thi
1ecb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1ecc0 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
1ecd0 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61  ach page that ha
1ece0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a  s already been .
1ecf0 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
1ed00 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65  the log file whe
1ed10 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  n a WAL transact
1ed20 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1ed30 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ck..** Parameter
1ed40 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65   iPg is the page
1ed50 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20   number of said 
1ed60 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61  page. The pCtx a
1ed70 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61  rgument .** is a
1ed80 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
1ed90 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1eda0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
1edb0 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70  If page iPg is p
1edc0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61  resent in the ca
1edd0 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20  che, and has no 
1ede0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1edf0 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73  rences,.** it is
1ee00 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65   discarded. Othe
1ee10 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
1ee20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
1ee30 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72  outstanding.** r
1ee40 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70  eferences, the p
1ee50 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72  age content is r
1ee60 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65  eloaded from the
1ee70 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
1ee80 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  e.** attempt to 
1ee90 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66  reload content f
1eea0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1eeb0 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64   is required and
1eec0 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75   fails, .** retu
1eed0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1eee0 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
1eef0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
1ef00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1ef10 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76  erUndoCallback(v
1ef20 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20  oid *pCtx, Pgno 
1ef30 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  iPg){.  int rc =
1ef40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1ef50 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1ef60 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50  ager *)pCtx;.  P
1ef70 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
1ef80 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1ef90 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  l(pPager) );.  p
1efa0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1efb0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1efc0 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1efd0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1efe0 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1eff0 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1f000 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1f010 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1f020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1f030 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1f040 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1f050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f060 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f070 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1f080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1f090 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1f0a0 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1f0b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1f0c0 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1f0d0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1f0e0 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1f0f0 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1f100 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1f110 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1f120 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1f130 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1f140 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1f150 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1f160 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1f170 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1f180 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1f190 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1f1a0 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1f1b0 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1f1c0 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1f1d0 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1f1e0 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1f1f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1f200 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1f210 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1f220 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1f230 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1f240 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1f250 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1f260 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1f270 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1f280 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1f290 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1f2a0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1f2b0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1f2c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f2d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f2e0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1f2f0 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1f300 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1f310 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1f320 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1f330 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1f340 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f360 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f370 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1f380 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f3a0 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1f3b0 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1f3c0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1f3d0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1f3e0 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1f3f0 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1f400 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1f410 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1f420 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1f430 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1f440 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1f450 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1f460 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1f470 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1f480 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1f490 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1f4a0 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1f4b0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1f4c0 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1f4d0 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1f4e0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1f4f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1f500 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1f510 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1f520 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1f530 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1f540 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1f550 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f560 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1f570 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f580 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1f590 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1f5a0 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1f5b0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1f5c0 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1f5d0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1f5e0 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1f5f0 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1f600 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1f610 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1f620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f640 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1f650 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1f660 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1f670 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1f680 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1f690 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1f6a0 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1f6b0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1f6c0 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1f6d0 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1f6e0 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1f6f0 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1f700 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1f710 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1f720 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1f730 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1f740 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1f750 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1f760 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1f770 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1f780 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1f790 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1f7a0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1f7b0 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1f7c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1f7d0 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1f7e0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1f7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1f800 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1f810 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1f840 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1f850 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f870 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1f880 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1f890 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1f8a0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1f8b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f8c0 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1f8d0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1f8e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f900 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1f910 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f930 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1f940 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50   in pList */.  P
1f950 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f970 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1f980 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61  er pages */..  a
1f990 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1f9a0 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1f9b0 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1f9c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f9d0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1f9e0 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1f9f0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1fa00 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1fa10 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1fa20 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1fa30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1fa40 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1fa50 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1fa60 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1fa70 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1fa80 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1fa90 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1faa0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1fab0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1fac0 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1fad0 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1fae0 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1faf0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1fb00 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1fb10 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1fb20 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1fb30 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1fb40 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1fb50 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1fb60 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1fb70 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1fb80 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1fb90 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1fba0 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65      PgHdr **ppNe
1fbb0 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20  xt = &pList;.   
1fbc0 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
1fbd0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70  for(p=pList; (*p
1fbe0 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70  pNext = p)!=0; p
1fbf0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1fc00 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d     if( p->pgno<=
1fc10 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  nTruncate ){.   
1fc20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70       ppNext = &p
1fc30 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
1fc40 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20    nList++;.     
1fc50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1fc60 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20  ert( pList );.  
1fc70 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74  }else{.    nList
1fc80 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 1;.  }.  pPag
1fc90 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
1fca0 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e  STAT_WRITE] += n
1fcb0 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69  List;..  if( pLi
1fcc0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
1fcd0 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1fce0 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
1fcf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1fd00 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e  lFrames(pPager->
1fd10 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61  pWal, .      pPa
1fd20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1fd30 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c  List, nTruncate,
1fd40 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65   isCommit, pPage
1fd50 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  r->walSyncFlags.
1fd60 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
1fd70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1fd80 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
1fd90 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1fda0 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1fdb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1fdc0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1fdd0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70  r->pBackup, p->p
1fde0 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44  gno, (u8 *)p->pD
1fdf0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1fe00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1fe10 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69  HECK_PAGES.  pLi
1fe20 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1fe30 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1fe40 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1fe50 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1fe60 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1fe70 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
1fe80 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e  hash(p);.  }.#en
1fe90 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1fea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
1feb0 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
1fec0 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a  ion on the WAL..
1fed0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1fee0 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61  ne used to be ca
1fef0 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53  lled "pagerOpenS
1ff00 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75  napshot()" becau
1ff10 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c  se it essentiall
1ff20 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61  y.** makes a sna
1ff30 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74  pshot of the dat
1ff40 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72  abase at the cur
1ff50 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69  rent point in ti
1ff60 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73  me and preserves
1ff70 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f  .** that snapsho
1ff80 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1ff90 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65   reader in spite
1ffa0 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79   of concurrently
1ffb0 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f   changes by.** o
1ffc0 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20  ther writers or 
1ffd0 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a  checkpointers..*
1ffe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1fff0 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
20000 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
20010 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
20040 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
20050 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20070 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
20080 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
20090 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
200a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
200b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
200c0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
200d0 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
200e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
200f0 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73  EADER );..  /* s
20100 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
20110 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
20120 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
20130 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
20140 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
20150 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
20160 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
20170 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
20180 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
20190 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
201a0 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
201b0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
201c0 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
201d0 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
201e0 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
201f0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
20200 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
20210 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
20220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
20230 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
20240 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
20250 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
20260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20270 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b  OK || changed ){
20280 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
20290 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
202a0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
202b0 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
202c0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
202d0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
202e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
202f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
20300 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20310 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
20320 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
20330 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
20340 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
20350 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
20360 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
20370 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20380 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
20390 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
203a0 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
203b0 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
203c0 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
203d0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
203e0 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
203f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
20400 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
20410 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
20420 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
20430 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
20440 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
20450 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
20460 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
20470 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
20480 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
20490 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
204a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
204b0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
204c0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
204d0 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
204e0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
204f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
20500 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
20510 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
20520 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
20530 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
20540 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
20550 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
20560 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
20570 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
20580 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
20590 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
205a0 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
205b0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
205c0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
205d0 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
205e0 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
205f0 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
20600 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
20610 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
20620 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
20630 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
20640 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
20650 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
20660 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
20670 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20680 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
20690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
206a0 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
206b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
206c0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
206d0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
206e0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
206f0 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61  File==0 );.  nPa
20700 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44  ge = sqlite3WalD
20710 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
20720 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  al);..  /* If th
20730 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
20740 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
20750 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
20760 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  le from the.  **
20770 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c   WAL sub-system,
20780 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
20790 61 67 65 20 63 6f 75 6e 74 20 62 61 73 65 64 20  age count based 
207a0 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20  on the size of. 
207b0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
207c0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73   file.  If the s
207d0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
207e0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
207f0 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  an.  ** integer 
20800 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
20810 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64  page-size, round
20820 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   up the result..
20830 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20840 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 73  ==0 && ALWAYS(is
20850 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
20860 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d  ) ){.    i64 n =
20870 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20880 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20890 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74  f db file in byt
208a0 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  es */.    int rc
208b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
208c0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
208d0 20 26 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63   &n);.    if( rc
208e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
208f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20900 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
20910 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67  = (Pgno)((n+pPag
20920 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20  er->pageSize-1) 
20930 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
20940 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
20950 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
20960 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20970 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
20980 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
20990 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
209a0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
209b0 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
209c0 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
209d0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
209e0 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
209f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
20a00 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
20a10 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
20a20 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
20a30 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
20a40 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
20a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20a60 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
20a70 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
20a80 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
20a90 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
20aa0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
20ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
20ac0 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
20ad0 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
20ae0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
20af0 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
20b00 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
20b10 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
20b20 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
20b30 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
20b40 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
20b50 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
20b60 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20b70 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
20b80 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
20b90 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
20ba0 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
20bb0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
20bc0 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
20bd0 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
20be0 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
20bf0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20c00 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
20c10 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
20c20 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
20c30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20c40 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
20c50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
20c60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
20c70 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
20c80 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
20c90 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
20ca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
20cb0 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
20cc0 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
20cd0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
20ce0 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
20cf0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
20d00 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
20d10 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
20d20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
20d30 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
20d40 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
20d50 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
20d60 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
20d70 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
20d80 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
20d90 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
20da0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
20db0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20dc0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
20dd0 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
20de0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
20df0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
20e00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20e10 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
20e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20e30 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
20e40 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  D_LOCK );..  if(
20e50 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
20e60 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
20e70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
20e80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20e90 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
20ea0 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ts */.    rc = s
20eb0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
20ec0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20ed0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
20ee0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
20ef0 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c  S_EXISTS, &isWal
20f00 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
20f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20f20 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c  .      if( isWal
20f30 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
20f40 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
20f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20f60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20f70 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
20f80 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
20f90 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
20fa0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
20fb0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20fc0 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
20fd0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20fe0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20ff0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
21000 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
21010 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  >zWal, 0);.     
21020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
21040 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
21050 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
21060 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
21070 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21080 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
21090 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
210a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
210b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
210c0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
210d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
210e0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
210f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
21100 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
21110 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
21120 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
21130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
21140 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
21150 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
21160 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
21170 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
21180 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
21190 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
211a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
211b0 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
211c0 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
211d0 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
211e0 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
211f0 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
21200 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
21210 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
21220 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
21230 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
21240 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
21250 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
21260 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
21270 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
21280 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
21290 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
212a0 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
212b0 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
212c0 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
212d0 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
212e0 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
212f0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
21300 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
21310 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21320 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
21330 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
21340 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
21350 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
21360 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
21370 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21380 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
21390 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
213a0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
213b0 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
213c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
213d0 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
213e0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
213f0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
21400 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
21410 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
21420 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
21430 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
21440 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
21450 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
21460 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
21470 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
21480 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
21490 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
214a0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
214b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
214c0 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
214d0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
214e0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
214f0 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
21500 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
21510 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
21520 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
21530 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
21540 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
21550 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
21560 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
21570 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
21580 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
21590 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
215a0 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
215b0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
215c0 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
215d0 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
215e0 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
215f0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
21600 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
21610 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
21620 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
21630 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
21640 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
21650 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
21660 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
21670 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
21680 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
21690 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
216a0 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
216b0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
216c0 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
216d0 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
216e0 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
216f0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
21700 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
21710 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
21720 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
21730 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
21740 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
21750 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
21760 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
21770 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
21780 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
21790 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
217a0 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
217b0 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
217c0 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
217d0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
217e0 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
217f0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
21800 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
21810 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
21820 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
21830 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
21840 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
21850 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
21860 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21880 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
21890 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
218a0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
218b0 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
218c0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
218d0 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
218e0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
218f0 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
21900 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
21910 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
21920 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
21930 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
21940 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
21950 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
21960 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
21970 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
21980 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
21990 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
219a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
219b0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
219c0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
219d0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
219e0 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
219f0 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
21a00 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
21a10 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
21a20 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
21a30 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
21a40 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
21a50 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
21a60 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
21a70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21a80 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
21a90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21aa0 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
21ab0 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
21ac0 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
21ad0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
21ae0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
21af0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
21b00 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
21b10 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
21b20 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
21b30 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
21b40 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
21b50 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
21b60 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
21b70 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
21b80 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
21b90 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
21ba0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
21bb0 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
21bc0 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
21bd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
21be0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21bf0 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
21c00 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
21c10 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
21c20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
21c30 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
21c40 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
21c50 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
21c60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21c70 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
21c80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
21c90 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
21ca0 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
21cb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21cc0 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
21cd0 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
21ce0 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
21cf0 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
21d00 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
21d10 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
21d20 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
21d30 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
21d40 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
21d50 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21d60 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
21d70 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
21d80 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
21d90 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
21da0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
21db0 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
21dc0 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
21dd0 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
21de0 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
21df0 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
21e00 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
21e10 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
21e20 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
21e30 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
21e40 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
21e50 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
21e60 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
21e70 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
21e80 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
21e90 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
21ea0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21eb0 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
21ec0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21ed0 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
21ee0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
21ef0 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
21f00 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
21f10 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
21f20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
21f30 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
21f40 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
21f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21f60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21f70 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
21f80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
21f90 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
21fa0 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
21fb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
21fc0 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
21fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21fe0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
22000 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22010 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
22020 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
22030 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
22040 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
22050 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
22060 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
22070 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
22080 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
22090 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
220a0 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
220b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
220c0 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
220d0 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
220e0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
220f0 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
22100 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
22110 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
22120 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
22130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22140 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
22150 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
22160 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
22170 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
22180 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
22190 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
221a0 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
221b0 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
221c0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
221d0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
221e0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
221f0 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
22200 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
22210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
22220 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
22230 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
22240 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
22250 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
22260 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
22270 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
22280 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
22290 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
222a0 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
222b0 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
222c0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
222d0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
222e0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
222f0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
22300 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
22310 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
22320 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
22330 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
22340 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
22350 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
22360 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
22370 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
22380 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
22390 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
223a0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
223b0 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
223c0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
223d0 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
223e0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
223f0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
22400 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
22410 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
22420 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
22430 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
22440 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22450 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22460 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
22470 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22480 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
22490 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
224a0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
224b0 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
224c0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
224d0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
224e0 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
224f0 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
22500 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
22510 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
22520 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
22530 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
22540 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
22550 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
22560 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
22570 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
22580 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
22590 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
225a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
225b0 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
225c0 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
225d0 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
225e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
225f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
22600 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
22610 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22620 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
22630 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
22640 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
22650 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
22660 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
22670 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
22680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22690 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
226a0 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
226b0 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
226c0 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
226d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
226e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
226f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
22700 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
22710 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
22720 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
22730 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22740 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
22750 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
22760 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
22770 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22780 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
22790 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
227a0 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
227b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
227c0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
227d0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
227e0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
227f0 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62  are allowed.** b
22800 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
22810 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61   to recycle clea
22820 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67  n and unused pag
22830 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
22840 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
22850 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
22860 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
22870 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
22880 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
22890 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
228a0 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
228b0 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
228c0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
228d0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
228e0 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  t are allowed.**
228f0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
22900 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65  ng to spill page
22910 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  s to journal..*/
22920 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22930 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61  rSetSpillsize(Pa
22940 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22950 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75   mxPage){.  retu
22960 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
22970 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61  SetSpillsize(pPa
22980 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
22990 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
229a0 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43  Invoke SQLITE_FC
229b0 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61  NTL_MMAP_SIZE ba
229c0 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65  sed on the curre
229d0 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d  nt value of szMm
229e0 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ap..*/.static vo
229f0 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  id pagerFixMapli
22a00 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
22a10 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  r){.#if SQLITE_M
22a20 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
22a30 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
22a40 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
22a50 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29    if( isOpen(fd)
22a60 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73   && fd->pMethods
22a70 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b  ->iVersion>=3 ){
22a80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
22a90 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20  64 sz;.    sz = 
22aa0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a  pPager->szMmap;.
22ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65      pPager->bUse
22ac0 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a  Fetch = (sz>0);.
22ad0 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74      setGetterMet
22ae0 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  hod(pPager);.   
22af0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
22b00 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
22b10 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
22b20 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73  TL_MMAP_SIZE, &s
22b30 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
22b40 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
22b50 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
22b60 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61  of any memory ma
22b70 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68  pping made of th
22b80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22b90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22ba0 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
22bb0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
22bc0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
22bd0 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72  zMmap){.  pPager
22be0 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61  ->szMmap = szMma
22bf0 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70  p;.  pagerFixMap
22c00 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d  limit(pPager);.}
22c10 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20  ../*.** Free as 
22c20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
22c30 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65  ossible from the
22c40 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20   pager..*/.void 
22c50 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
22c60 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nk(Pager *pPager
22c70 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
22c80 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d  heShrink(pPager-
22c90 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
22ca0 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69  .** Adjust setti
22cb0 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  ngs of the pager
22cc0 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
22cd0 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61  ied in the pgFla
22ce0 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  gs parameter..**
22cf0 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20  .** The "level" 
22d00 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  in pgFlags & PAG
22d10 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
22d20 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62  ASK sets the rob
22d30 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68  ustness.** of th
22d40 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
22d50 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
22d60 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20  rashes or power 
22d70 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63  failures by.** c
22d80 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
22d90 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
22da0 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  hen writing the 
22db0 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
22dc0 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65  re are four leve
22dd0 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
22de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
22df0 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
22e00 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
22e10 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
22e30 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
22e40 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
22e50 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
22e60 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
22e70 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
22e80 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
22e90 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
22ea0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
22eb0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
22ec0 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
22ed0 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
22ef0 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
22f00 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
22f10 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
22f20 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
22f30 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
22f40 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
22f50 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
22f60 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
22f70 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
22f80 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
22f90 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
22fa0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
22fb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
22fc0 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
22fd0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
22fe0 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
22ff0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
23000 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
23010 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
23020 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23030 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
23040 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
23050 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
23060 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
23080 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
23090 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
230a0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
230b0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
230c0 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
230d0 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
230e0 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
230f0 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
23100 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
23110 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
23120 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
23130 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23140 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
23150 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
23160 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
23170 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
23180 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
23190 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
231a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
231b0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
231c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41  ..**.**    EXTRA
231d0 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
231e0 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68  e FULL except th
231f0 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73  at is also syncs
23200 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
23210 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
23220 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
23230 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
23240 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c  l after the roll
23250 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  back.**         
23260 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20       journal is 
23270 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20  unlinked..**.** 
23280 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72  The above is for
23290 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72   a rollback-jour
232a0 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57  nal mode.  For W
232b0 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e  AL mode, OFF con
232c0 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61  tinues.** to mea
232d0 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20  n that no syncs 
232e0 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52  ever occur.  NOR
232f0 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  MAL means that t
23300 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64  he WAL is synced
23310 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65  .** prior to the
23320 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70   start of checkp
23330 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68  oint and that th
23340 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
23350 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20  is synced.** at 
23360 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
23370 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  f the checkpoint
23380 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63   if the entire c
23390 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41  ontent of the WA
233a0 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e  L.** was written
233b0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
233c0 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f  atabase.  But no
233d0 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73   sync operations
233e0 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e   occur for.** an
233f0 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74   ordinary commit
23400 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20   in NORMAL mode 
23410 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20  with WAL.  FULL 
23420 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
23430 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79  AL.** file is sy
23440 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  nced following e
23450 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61  ach commit opera
23460 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f  tion, in additio
23470 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63  n to the.** sync
23480 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
23490 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65  h NORMAL.  There
234a0 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
234b0 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a  e between FULL.*
234c0 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20  * and EXTRA for 
234d0 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
234e0 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73  Do not confuse s
234f0 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
23500 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43  with SQLITE_SYNC
23510 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53  _FULL.  The.** S
23520 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
23530 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75  macro means to u
23540 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74  se the MacOSX-st
23550 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a  yle full-fsync.*
23560 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f  * using fcntl(F_
23570 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c  FULLFSYNC).  SQL
23580 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
23590 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a  means to do an.*
235a0 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63  * ordinary fsync
235b0 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20  () call.  There 
235c0 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
235d0 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f   between SQLITE_
235e0 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64  SYNC_FULL.** and
235f0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
23600 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73  MAL on platforms
23610 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f   other than MacO
23620 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20  SX.  But the.** 
23630 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
23640 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e   versus synchron
23650 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69  ous=NORMAL setti
23660 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ng determines wh
23670 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20  en.** the xSync 
23680 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c  primitive is cal
23690 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76  led and is relev
236a0 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66  ant to all platf
236b0 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  orms..**.** Nume
236c0 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
236d0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
236e0 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
236f0 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
23700 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
23710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23720 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
23730 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
23740 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50  gerSetFlags(.  P
23750 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
23760 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
23770 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20  r to set safety 
23780 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75  level for */.  u
23790 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
237a0 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
237b0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e  flags */.){.  un
237c0 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70  signed level = p
237d0 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53  gFlags & PAGER_S
237e0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b  YNCHRONOUS_MASK;
237f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
23800 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
23810 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
23820 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  1;.    pPager->f
23830 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  ullSync = 0;.   
23840 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
23850 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
23860 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
23870 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41  ync =  level==PA
23880 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
23890 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50  OFF ?1:0;.    pP
238a0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
238b0 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59   level>=PAGER_SY
238c0 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f  NCHRONOUS_FULL ?
238d0 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1:0;.    pPager-
238e0 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76  >extraSync = lev
238f0 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el==PAGER_SYNCHR
23900 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30  ONOUS_EXTRA ?1:0
23910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
23920 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
23930 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23940 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
23950 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
23960 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29  AGER_FULLFSYNC )
23970 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
23980 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23990 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
239a0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
239b0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
239c0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
239d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77  .  }.  pPager->w
239e0 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 28 70  alSyncFlags = (p
239f0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23a00 3c 3c 32 29 3b 0a 20 20 69 66 28 20 70 50 61 67  <<2);.  if( pPag
23a10 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
23a20 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
23a30 79 6e 63 46 6c 61 67 73 20 7c 3d 20 70 50 61 67  yncFlags |= pPag
23a40 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20  er->syncFlags;. 
23a50 20 7d 0a 20 20 69 66 28 20 28 70 67 46 6c 61 67   }.  if( (pgFlag
23a60 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46  s & PAGER_CKPT_F
23a70 55 4c 4c 46 53 59 4e 43 29 20 26 26 20 21 70 50  ULLFSYNC) && !pP
23a80 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
23a90 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
23aa0 79 6e 63 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  yncFlags |= (SQL
23ab0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32  ITE_SYNC_FULL<<2
23ac0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46  );.  }.  if( pgF
23ad0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43  lags & PAGER_CAC
23ae0 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70  HESPILL ){.    p
23af0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
23b00 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f  l &= ~SPILLFLAG_
23b10 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OFF;.  }else{.  
23b20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
23b30 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
23b40 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  G_OFF;.  }.}.#en
23b50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
23b60 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
23b70 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
23b80 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
23b90 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
23ba0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
23bb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23bc0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
23bd0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
23be0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
23bf0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
23c00 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
23c10 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
23c20 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
23c30 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
23c40 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
23c50 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
23c60 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
23c70 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
23c80 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
23c90 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
23ca0 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
23cb0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
23cc0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
23cd0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
23ce0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
23cf0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
23d00 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
23d10 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
23d20 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
23d30 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
23d40 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
23d50 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
23d60 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
23d70 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
23d80 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
23d90 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
23da0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
23db0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
23dc0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
23dd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23de0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
23df0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
23e00 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
23e10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
23e20 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
23e30 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
23e40 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
23e50 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
23e60 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
23e70 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
23e80 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
23e90 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
23ea0 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
23eb0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
23ec0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
23ed0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ef0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
23f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23f10 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
23f20 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
23f30 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
23f40 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
23f50 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
23f60 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
23f70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23f80 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
23f90 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
23fa0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
23fb0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
23fc0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
23fd0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
23fe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
23ff0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
24000 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
24010 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
24020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24030 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
24040 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
24050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
24060 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
24070 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
24080 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
24090 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
240a0 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
240b0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
240c0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
240d0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
240e0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
240f0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
24100 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
24110 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
24120 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
24130 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
24140 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
24150 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
24160 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
24170 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
24180 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
24190 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
241a0 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
241b0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
241c0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
241d0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
241e0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
241f0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
24200 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
24210 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
24230 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
24240 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
24250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24280 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
24290 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
242a0 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
242b0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
242c0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
242d0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
242e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
242f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
24300 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
24310 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
24320 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
24330 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
24340 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
24350 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
24360 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
24370 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
24380 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
24390 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
243a0 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
243b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
243c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
243d0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
243e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
243f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
24400 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
24410 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
24440 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
24450 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
24460 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
24470 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
24480 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
24490 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
244a0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
244b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
244c0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
244d0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
244e0 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  */.){.  pPager->
244f0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
24500 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
24510 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
24520 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
24530 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28  ndlerArg;..  if(
24540 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24550 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
24560 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29  **ap = (void **)
24570 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61  &pPager->xBusyHa
24580 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72  ndler;.    asser
24590 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64  t( ((int(*)(void
245a0 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42   *))(ap[0]))==xB
245b0 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20  usyHandler );.  
245c0 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d    assert( ap[1]=
245d0 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  =pBusyHandlerArg
245e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
245f0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
24600 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
24610 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41  ITE_FCNTL_BUSYHA
24620 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61  NDLER, (void *)a
24630 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
24640 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
24650 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
24660 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
24670 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
24680 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
24690 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
246a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
246b0 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
246c0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
246d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
246e0 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
246f0 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
24700 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
24710 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
24720 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
24730 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
24740 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
24750 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
24760 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
24770 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
24780 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
24790 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
247a0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
247b0 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
247c0 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
247d0 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
247e0 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
247f0 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
24800 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
24810 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
24820 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
24830 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
24840 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
24850 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
24860 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
24870 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
24880 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
24890 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
248a0 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
248b0 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
248c0 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
248d0 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
248e0 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
248f0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
24900 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
24910 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
24920 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
24930 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
24940 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
24950 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
24960 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
24970 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
24980 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
24990 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
249a0 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
249b0 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
249c0 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
249d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
249e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
249f0 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
24a00 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
24a10 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
24a20 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
24a30 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
24a40 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
24a50 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
24a60 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
24a70 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
24a80 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
24a90 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
24aa0 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
24ab0 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
24ac0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
24ad0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
24ae0 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
24af0 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
24b00 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
24b10 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
24b20 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
24b30 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
24b40 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
24b50 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
24b60 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
24b70 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
24b80 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
24b90 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
24ba0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
24bb0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24bc0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
24bd0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
24be0 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
24bf0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
24c00 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
24c10 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
24c20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
24c30 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
24c40 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
24c50 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
24c60 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
24c70 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
24c80 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
24c90 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
24ca0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
24cb0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
24cc0 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
24cd0 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
24ce0 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
24cf0 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
24d00 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
24d10 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
24d20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
24d30 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
24d40 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
24d50 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
24d60 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
24d70 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
24d80 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
24d90 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
24da0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
24db0 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
24dc0 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
24dd0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
24de0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
24df0 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
24e00 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
24e10 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
24e20 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
24e30 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
24e40 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24e50 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
24e60 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
24e70 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
24e80 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
24e90 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
24ea0 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
24eb0 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
24ec0 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
24ed0 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
24ee0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24ef0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
24f00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24f10 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
24f20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
24f30 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
24f40 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
24f50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24f60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
24f70 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
24f80 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
24f90 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
24fa0 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
24fb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
24fc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24fe0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
24ff0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
25000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25010 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
25020 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
25030 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
25040 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
25050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25060 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
25070 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
25080 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ace);.      pPag
25090 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
250a0 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67  pNew;.      pPag
250b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67  er->dbSize = (Pg
250c0 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53  no)((nByte+pageS
250d0 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29  ize-1)/pageSize)
250e0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
250f0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
25100 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
25110 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25120 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
25130 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65   }.  }..  *pPage
25140 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
25150 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72  ageSize;.  if( r
25160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25170 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
25180 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
25190 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
251a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
251b0 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
251c0 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
251d0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
251e0 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
251f0 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
25200 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
25210 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70  .    pagerFixMap
25220 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  limit(pPager);. 
25230 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25240 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25250 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25260 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
25270 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
25280 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
25290 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
252a0 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
252b0 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
252c0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
252d0 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
252e0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
252f0 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
25300 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
25310 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
25320 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
25330 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
25340 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
25350 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
25360 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
25370 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
25380 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
25390 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
253a0 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
253b0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
253c0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
253d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
253e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
253f0 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
25400 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
25410 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
25420 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
25430 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
25440 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
25450 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
25460 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
25470 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
25480 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
25490 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
254a0 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
254b0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
254c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
254d0 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
254e0 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
254f0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
25500 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
25510 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
25520 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
25530 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
25540 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
25550 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
25560 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
25570 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
25580 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
25590 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
255a0 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20  ER_OPEN );      
255b0 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62  /* Called only b
255c0 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f  y OP_MaxPgcnt */
255d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
255e0 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65  r->mxPgno>=pPage
255f0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a  r->dbSize );  /*
25600 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66   OP_MaxPgcnt enf
25610 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  orces this */.  
25620 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
25630 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
25640 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
25650 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
25660 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
25670 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
25680 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
25690 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
256a0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
256b0 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
256c0 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
256d0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
256e0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
256f0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
25700 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
25710 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
25720 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
25730 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
25740 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
25750 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
25760 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
25770 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
25780 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
25790 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
257a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
257b0 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
257c0 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
257d0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
257e0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
257f0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
25800 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25810 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
25820 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
25830 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
25840 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
25850 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
25860 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
25870 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
25880 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
25890 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
258a0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
258b0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
258c0 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
258d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
258e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
258f0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
25900 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
25910 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
25920 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
25930 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
25940 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
25950 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
25960 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
25970 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
25980 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
25990 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
259a0 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
259b0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
259c0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
259d0 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
259e0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
259f0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
25a00 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
25a10 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
25a20 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
25a30 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
25a40 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
25a50 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
25a60 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
25a70 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
25a80 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
25a90 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
25aa0 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
25ab0 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
25ac0 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
25ad0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
25ae0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
25af0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
25b00 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
25b10 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
25b20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25b30 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
25b40 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
25b50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25b60 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
25b70 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
25b80 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
25b90 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
25ba0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25bb0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
25bc0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
25bd0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
25be0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
25bf0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
25c00 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
25c10 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
25c20 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
25c30 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
25c40 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
25c50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
25c60 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
25c70 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
25c80 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
25c90 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
25ca0 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
25cb0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
25cc0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
25cd0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25ce0 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
25cf0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
25d00 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
25d10 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
25d20 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
25d30 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
25d40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
25d50 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
25d60 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
25d70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25db0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
25dc0 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74  ed when a read-t
25dd0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
25de0 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  en on.** the pag
25df0 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  er. It returns t
25e00 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
25e10 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
25e20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
25e30 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
25e40 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
25e50 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
25e60 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
25e70 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
25e80 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
25e90 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76   page file..*/.v
25ea0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
25eb0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
25ec0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
25ed0 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
25ee0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
25ef0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
25f00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25f10 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
25f20 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
25f30 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
25f40 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
25f50 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.}.../*.** T
25f60 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
25f70 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
25f80 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
25f90 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
25fa0 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
25fb0 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
25fc0 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
25fd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
25fe0 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
25ff0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
26000 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
26010 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
26020 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
26030 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
26040 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
26050 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
26060 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
26070 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
26080 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
26090 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
260a0 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
260b0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
260c0 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
260d0 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
260e0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
260f0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
26100 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
26110 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
26120 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
26130 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
26140 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
26150 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
26160 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
26170 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
26180 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
26190 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
261a0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
261b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
261c0 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
261d0 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
261e0 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
261f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
26220 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
26230 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
26240 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
26250 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
26260 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
26270 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
26280 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f   held), or one o
26290 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  f the transition
262a0 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
262b0 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
262c0 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
262d0 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
262e0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
262f0 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
26300 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
26310 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
26320 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
26330 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ock>=locktype). 
26340 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
26350 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
26360 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
26370 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
26380 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
26390 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
263a0 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
263b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
263c0 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20    );..  do {.   
263d0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
263e0 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  b(pPager, lockty
263f0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  pe);.  }while( r
26400 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
26410 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
26420 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
26430 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
26440 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26450 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
26460 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
26470 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
26480 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
26490 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
264a0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
264b0 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
264c0 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
264d0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
264e0 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
264f0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
26500 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
26510 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
26520 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
26530 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
26540 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
26550 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
26560 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
26570 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
26580 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
26590 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
265a0 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
265b0 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
265c0 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
265d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
265e0 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
265f0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
26600 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
26610 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
26620 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
26630 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
26640 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
26650 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
26660 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
26670 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
26680 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
26690 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
266a0 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
266b0 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
266c0 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
266d0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
266e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
266f0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
26700 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
26710 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
26720 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
26730 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
26740 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
26750 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
26760 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74  would be to rest
26770 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ore the current.
26780 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
26790 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c  e page. However,
267a0 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74   since this cont
267b0 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
267c0 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  nt in either.** 
267d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
267e0 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e  e or the portion
267f0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
26800 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a   journal and .**
26810 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   sub-journal rol
26820 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e  led back the con
26830 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tent could not b
26840 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74  e restored and t
26850 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69  he.** database i
26860 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d  mage would becom
26870 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73  e corrupt. It is
26880 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75   therefore fortu
26890 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68  nate that .** th
268a0 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20  is circumstance 
268b0 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f  cannot arise..*/
268c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
268d0 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
268e0 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
268f0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
26900 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  b(PgHdr *pPg){. 
26910 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
26920 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
26930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75  );.  assert( !su
26940 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
26950 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
26960 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  <=pPg->pPager->d
26970 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69  bSize );.}.stati
26980 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
26990 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
269a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
269b0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
269c0 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
269d0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73  er->pPCache, ass
269e0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
269f0 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73  raintCb);.}.#els
26a00 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
26a10 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26a20 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64  int(pPager).#end
26a30 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
26a40 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
26a50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26a60 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
26a70 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
26a80 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
26a90 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
26aa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26ab0 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
26ac0 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
26ad0 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
26ae0 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
26af0 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
26b00 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
26b10 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
26b20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
26b30 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
26b40 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tted..**.** This
26b50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
26b60 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  y called right b
26b70 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
26b80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
26b90 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e  ** Once this fun
26ba0 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
26bb0 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73  alled, the trans
26bc0 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68  action must eith
26bd0 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20  er be.** rolled 
26be0 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65  back or committe
26bf0 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  d. It is not saf
26c00 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  e to call this f
26c10 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74  unction and.** t
26c20 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69  hen continue wri
26c30 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
26c40 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
26c50 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
26c60 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
26c70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
26c80 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
26c90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50  ager->dbSize>=nP
26ca0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
26cb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
26cc0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
26cd0 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67  CHEMOD );.  pPag
26ce0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
26cf0 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65  ge;..  /* At one
26d00 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20   point the code 
26d10 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65  here called asse
26d20 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26d30 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65  aint() to.  ** e
26d40 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70  nsure that all p
26d50 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63  ages being trunc
26d60 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69  ated away by thi
26d70 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c  s operation are,
26d80 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20  .  ** if one or 
26d90 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20  more savepoints 
26da0 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e  are open, presen
26db0 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69  t in the savepoi
26dc0 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  nt .  ** journal
26dd0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
26de0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66  n be restored if
26df0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
26e00 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61  s rolled.  ** ba
26e10 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c  ck. This is no l
26e20 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20  onger necessary 
26e30 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  as this function
26e40 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a   is now only.  *
26e50 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  * called right b
26e60 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
26e70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
26e80 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20  So although the 
26e90 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65  .  ** Pager obje
26ea0 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76  ct may still hav
26eb0 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
26ec0 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  s (Pager.nSavepo
26ed0 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74  int!=0), .  ** t
26ee0 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  hey cannot be ro
26ef0 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68  lled back. So th
26f00 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
26f10 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c  Constraint() cal
26f20 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e  l.  ** is no lon
26f30 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a  ger correct. */.
26f40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
26f50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26f60 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
26f70 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
26f80 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a  l rollback. It.*
26f90 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  * syncs the jour
26fa0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  nal file to disk
26fb0 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67  , then sets pPag
26fc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  er->journalHdr t
26fd0 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66  o the.** size of
26fe0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26ff0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
27000 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
27010 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20  outine knows.** 
27020 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
27030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
27040 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a   been synced..**
27050 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f  .** Syncing a ho
27060 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73  t-journal to dis
27070 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
27080 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ing to roll it b
27090 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20  ack ensures .** 
270a0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d  that if a power-
270b0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64  failure occurs d
270c0 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
270d0 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20  ck, the process 
270e0 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73  that.** attempts
270f0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
27100 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76  ing system recov
27110 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d  ery sees the sam
27120 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e  e journal.** con
27130 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f  tent as this pro
27140 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  cess..**.** If e
27150 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
27160 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54  s planned, SQLIT
27170 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
27180 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
27190 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
271a0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
271b0 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f   int pagerSyncHo
271c0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
271d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
271e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
271f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
27200 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
27210 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
27220 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
27230 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
27240 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
27250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27260 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
27270 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
27280 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  fd, &pPager->jou
27290 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20  rnalHdr);.  }.  
272a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
272b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
272c0 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f  P_SIZE>0./*.** O
272d0 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
272e0 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61  e to a memory ma
272f0 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  pped page object
27300 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
27310 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e   pgno. .** The n
27320 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75  ew object will u
27330 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  se the pointer p
27340 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66  Data, obtained f
27350 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a  rom xFetch()..**
27360 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
27370 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70  set *ppPage to p
27380 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
27390 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a  page reference.*
273a0 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  * and return SQL
273b0 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
273c0 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  e, return an SQL
273d0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ite error code a
273e0 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67  nd set.** *ppPag
273f0 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  e to zero..**.**
27400 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   Page references
27410 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c   obtained by cal
27420 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
27430 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c  on should be rel
27440 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c  eased.** by call
27450 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65  ing pagerRelease
27460 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
27470 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
27480 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20  quireMapPage(.  
27490 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
274c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
274f0 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ber */.  void *p
27500 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
27510 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
27520 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20  ch()'d data for 
27530 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
27540 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20  gHdr **ppPage   
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27560 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20  * OUT: Acquired 
27570 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  page object */.)
27580 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275a0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
275b0 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74  pped page to ret
275c0 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20  urn */.  .  if( 
275d0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
275e0 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70  elist ){.    *pp
275f0 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65  Page = p = pPage
27600 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27610 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d  ;.    pPager->pM
27620 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d  mapFreelist = p-
27630 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
27640 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
27650 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27660 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20  nExtra>=8 );.   
27670 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72   memset(p->pExtr
27680 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73  a, 0, 8);.  }els
27690 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
276a0 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71   p = (PgHdr *)sq
276b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
276c0 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20  sizeof(PgHdr) + 
276d0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
276e0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
276f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
27700 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
27710 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
27720 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
27730 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
27740 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27750 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
27760 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72    }.    p->pExtr
27770 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31  a = (void *)&p[1
27780 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  ];.    p->flags 
27790 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20  = PGHDR_MMAP;.  
277a0 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
277b0 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70     p->pPager = p
277c0 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73  Pager;.  }..  as
277d0 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d  sert( p->pExtra=
277e0 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29  =(void *)&p[1] )
277f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
27800 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
27810 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50  ert( p->flags==P
27820 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61  GHDR_MMAP );.  a
27830 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72  ssert( p->pPager
27840 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
27850 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31  sert( p->nRef==1
27860 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d   );..  p->pgno =
27870 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74   pgno;.  p->pDat
27880 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61  a = pData;.  pPa
27890 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b  ger->nMmapOut++;
278a0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
278b0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
278c0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
278d0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
278e0 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20  e pPg. pPg must 
278f0 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e  have been return
27900 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72  ed by an .** ear
27910 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67  lier call to pag
27920 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
27930 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
27940 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  id pagerReleaseM
27950 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  apPage(PgHdr *pP
27960 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
27970 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
27980 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  r;.  pPager->nMm
27990 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e  apOut--;.  pPg->
279a0 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d  pDirty = pPager-
279b0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
279c0 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
279d0 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a  reelist = pPg;..
279e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
279f0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  ->fd->pMethods->
27a00 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20  iVersion>=3 );. 
27a10 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
27a20 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
27a30 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
27a40 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
27a50 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  e, pPg->pData);.
27a60 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
27a70 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  l PgHdr objects 
27a80 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61  stored in the Pa
27a90 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73  ger.pMmapFreelis
27aa0 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
27ab0 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65  c void pagerFree
27ac0 4d 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70  MapHdrs(Pager *p
27ad0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
27ae0 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65  *p;.  PgHdr *pNe
27af0 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67  xt;.  for(p=pPag
27b00 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27b10 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  t; p; p=pNext){.
27b20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
27b30 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74  Dirty;.    sqlit
27b40 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
27b50 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  }.../*.** Shutdo
27b60 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
27b70 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
27b80 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
27b90 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
27ba0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
27bb0 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
27bc0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
27bd0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
27be0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
27bf0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
27c00 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
27c10 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
27c20 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
27c30 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
27c40 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
27c50 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
27c60 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
27c70 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
27c80 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
27c90 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
27ca0 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
27cb0 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
27cc0 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
27cd0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
27ce0 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
27cf0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
27d00 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
27d10 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
27d20 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
27d30 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
27d40 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
27d50 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
27d60 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
27d70 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
27d80 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
27d90 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
27da0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
27db0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
27dc0 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
27dd0 61 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64  ager, sqlite3 *d
27de0 62 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  b){.  u8 *pTmp =
27df0 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
27e00 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73  TmpSpace;..  ass
27e10 65 72 74 28 20 64 62 20 7c 7c 20 70 61 67 65 72  ert( db || pager
27e20 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
27e30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
27e40 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
27e50 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64  e(pPager) );.  d
27e60 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
27e70 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
27e80 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
27e90 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61  gnMalloc();.  pa
27ea0 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70  gerFreeMapHdrs(p
27eb0 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61  Pager);.  /* pPa
27ec0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
27ed0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
27ee0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
27ef0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
27f00 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65  _OMIT_WAL.  asse
27f10 72 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72  rt( db || pPager
27f20 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 73  ->pWal==0 );.  s
27f30 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
27f40 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c  Pager->pWal, db,
27f50 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
27f60 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
27f70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 28  ageSize,.      (
27f80 64 62 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  db && (db->flags
27f90 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74   & SQLITE_NoCkpt
27fa0 4f 6e 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70  OnClose) ? 0 : p
27fb0 54 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50 61 67  Tmp).  );.  pPag
27fc0 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
27fd0 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
27fe0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
27ff0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
28000 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
28010 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
28020 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
28030 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
28040 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
28050 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
28060 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
28070 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
28080 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
28090 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
280a0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
280b0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
280c0 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
280d0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
280e0 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
280f0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
28100 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
28110 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
28120 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
28130 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
28140 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
28150 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
28160 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
28170 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
28180 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
28190 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
281a0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
281b0 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
281c0 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
281d0 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
281e0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
281f0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
28200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
28210 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
28220 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
28230 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
28240 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
28250 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
28260 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
28270 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
28280 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
28290 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
282a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
282b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
282c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
282d0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
282e0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
282f0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
28300 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
28310 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
28320 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
28330 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
28340 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
28350 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
28360 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
28370 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
28380 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
28390 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
283a0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
283b0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
283c0 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
283d0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
283e0 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
283f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
28400 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
28410 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
28420 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
28430 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
28440 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
28450 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
28460 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
28470 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
28480 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
28490 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
284a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
284b0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
284c0 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
284d0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
284e0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
284f0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
28500 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
28510 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
28520 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
28530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28540 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
28550 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
28560 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
28570 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
28580 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
28590 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
285a0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
285b0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
285c0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
285d0 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
285e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
285f0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
28600 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
28610 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
28620 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
28630 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
28640 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
28650 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
28660 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
28670 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
28680 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
28690 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
286a0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
286b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
286c0 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
286d0 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
286e0 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
286f0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
28700 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
28710 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
28720 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
28730 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
28740 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
28750 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
28760 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28770 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
28780 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
28790 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
287a0 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
287b0 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
287c0 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
287d0 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
287e0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
287f0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
28800 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
28810 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
28820 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
28830 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
28840 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
28850 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
28860 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
28870 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
28880 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
28890 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
288a0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
288b0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
288c0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
288d0 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
288e0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
288f0 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
28900 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
28910 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
28920 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
28930 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
28940 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
28950 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
28960 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
28970 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
28980 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
28990 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
289a0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
289b0 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
289c0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
289d0 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
289e0 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
289f0 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
28a00 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
28a10 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
28a20 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
28a30 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
28a40 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
28a50 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
28a60 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
28a70 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
28a80 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
28a90 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
28aa0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
28ab0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
28ac0 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
28ad0 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
28ae0 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
28af0 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
28b00 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
28b10 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
28b20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
28b30 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
28b40 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
28b50 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
28b60 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
28b70 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
28b80 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
28b90 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
28ba0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
28bb0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
28bc0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
28bd0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
28be0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
28bf0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
28c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
28c10 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
28c20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
28c30 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28c60 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
28c70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
28c80 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
28c90 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
28ca0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
28cb0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
28cc0 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
28cd0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
28ce0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
28cf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
28d00 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
28d10 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
28d20 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
28d30 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
28d40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
28d50 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28d60 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
28d70 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
28d80 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
28d90 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
28da0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
28db0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
28dc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
28dd0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
28de0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
28df0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
28e00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
28e10 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
28e20 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
28e30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
28e40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
28e50 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
28e60 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
28e70 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
28e80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
28e90 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
28ea0 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
28eb0 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
28ec0 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
28ed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
28ee0 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
28ef0 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
28f00 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
28f10 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
28f20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
28f30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
28f40 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
28f50 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
28f60 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
28f70 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
28f80 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
28f90 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
28fa0 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
28fb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
28fc0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
28fd0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
28fe0 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
28ff0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
29000 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
29010 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
29020 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
29030 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
29040 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
29050 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
29060 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
29070 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
29080 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
29090 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
290a0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
290b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
290c0 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
290d0 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
290e0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
290f0 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
29100 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
29110 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
29120 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
29130 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
29140 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
29150 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
29160 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
29170 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
29180 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
29190 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
291a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
291b0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
291c0 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
291d0 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
291e0 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
291f0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
29200 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
29210 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
29220 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
29230 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
29240 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
29250 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
29260 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
29270 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
29280 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
29290 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
292a0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
292b0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
292c0 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
292d0 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
292e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
292f0 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
29300 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
29310 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
29320 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
29330 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
29340 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
29350 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
29360 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
29370 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
29380 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
29390 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
293a0 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
293b0 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
293c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
293d0 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
293e0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
293f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
29400 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
29410 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
29420 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
29430 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
29440 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
29450 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
29460 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
29470 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
29480 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
29490 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
294a0 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
294b0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
294c0 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
294d0 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
294e0 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
294f0 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
29500 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
29510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
29520 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
29530 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
29540 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
29550 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29560 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
29570 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
29580 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
29590 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
295a0 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
295b0 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
295c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
295d0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
295e0 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
295f0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
29600 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29610 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29620 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
29630 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
29640 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
29650 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29660 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
29670 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
29680 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
29690 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
296a0 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
296b0 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
296c0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
296d0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
296e0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
296f0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
29700 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
29710 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
29720 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
29730 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
29740 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
29750 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
29760 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
29770 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
29780 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
29790 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
297a0 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
297b0 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
297c0 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
297d0 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
297e0 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
297f0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
29800 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
29810 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
29820 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
29830 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
29840 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
29850 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
29860 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
29870 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
29880 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
29890 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
298a0 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
298b0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
298c0 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
298d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
298e0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
298f0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
29900 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
29910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
29920 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
29930 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
29940 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
29950 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
29960 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
29970 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
29980 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
29990 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
299a0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
299b0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
299c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
299d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
299e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
299f0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
29a00 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
29a10 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
29a20 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
29a30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
29a40 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
29a50 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
29a60 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
29a70 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
29a80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29a90 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
29aa0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29ab0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29ac0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
29ad0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
29ae0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
29af0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
29b00 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
29b10 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
29b20 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29b30 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
29b40 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
29b50 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
29b60 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
29b70 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
29b80 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
29b90 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20  r->syncFlags| . 
29ba0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
29bb0 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c  ->syncFlags==SQL
29bc0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
29bd0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
29be0 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
29bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
29c10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
29c20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
29c30 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
29c40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
29c50 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
29c60 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
29c70 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
29c80 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
29c90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
29ca0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
29cb0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
29cc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
29cd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29ce0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29d00 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
29d10 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
29d20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
29d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
29d40 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
29d50 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
29d60 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
29d70 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
29d80 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
29d90 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
29da0 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
29db0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
29dc0 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
29dd0 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
29de0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
29df0 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
29e00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
29e10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
29e20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
29e30 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
29e40 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
29e50 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
29e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
29e80 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
29e90 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
29ea0 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
29eb0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
29ec0 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
29ed0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
29ee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
29ef0 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
29f00 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
29f10 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
29f20 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
29f30 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
29f40 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
29f50 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
29f60 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
29f70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
29f80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
29f90 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
29fa0 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
29fb0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
29fc0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
29fd0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
29fe0 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
29ff0 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
2a000 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
2a010 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
2a020 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
2a030 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
2a040 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2a050 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
2a060 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
2a070 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2a080 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
2a090 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
2a0a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2a0b0 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
2a0c0 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
2a0d0 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
2a0e0 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
2a0f0 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
2a100 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
2a110 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
2a120 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
2a130 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
2a140 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
2a150 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
2a160 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
2a170 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
2a180 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
2a190 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
2a1a0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
2a1b0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
2a1c0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
2a1d0 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
2a1e0 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
2a1f0 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
2a200 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
2a210 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2a220 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
2a230 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
2a240 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
2a250 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
2a260 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
2a270 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
2a280 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
2a290 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
2a2a0 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
2a2b0 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
2a2c0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
2a2d0 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
2a2e0 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
2a2f0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
2a300 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
2a310 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
2a320 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
2a330 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
2a340 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
2a350 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
2a360 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
2a370 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
2a380 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2a390 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
2a3a0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2a3b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2a3c0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2a3d0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
2a3e0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2a3f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
2a400 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
2a410 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
2a420 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
2a430 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2a440 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2a450 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
2a460 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
2a470 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
2a480 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
2a490 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a4b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2a4c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a4d0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
2a4e0 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
2a4f0 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
2a500 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
2a510 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
2a520 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2a530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2a540 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
2a550 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2a560 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
2a570 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
2a580 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
2a590 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
2a5a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2a5b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2a5c0 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  || pList->pDirty
2a5d0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
2a5e0 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
2a5f0 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
2a600 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
2a610 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
2a620 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
2a630 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
2a640 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
2a650 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
2a660 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
2a670 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
2a680 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
2a690 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
2a6a0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
2a6b0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2a6c0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
2a6d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
2a6e0 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
2a6f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2a700 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
2a710 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
2a720 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
2a730 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
2a740 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
2a750 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
2a760 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
2a770 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
2a780 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
2a790 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
2a7a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2a7b0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2a7c0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2a7d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a7e0 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65  _OK .   && pPage
2a7f0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50  r->dbHintSize<pP
2a800 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20  ager->dbSize.   
2a810 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74  && (pList->pDirt
2a820 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  y || pList->pgno
2a830 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  >pPager->dbHintS
2a840 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ize).  ){.    sq
2a850 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69  lite3_int64 szFi
2a860 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  le = pPager->pag
2a870 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
2a880 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64  _int64)pPager->d
2a890 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74  bSize;.    sqlit
2a8a0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
2a8b0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
2a8c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
2a8d0 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29  E_HINT, &szFile)
2a8e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
2a8f0 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
2a900 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a  r->dbSize;.  }..
2a910 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2a920 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
2a930 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2a940 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
2a950 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2a960 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
2a970 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
2a980 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
2a990 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
2a9a0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
2a9b0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
2a9c0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
2a9d0 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
2a9e0 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
2a9f0 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
2aa00 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
2aa10 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
2aa20 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
2aa30 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
2aa40 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
2aa50 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
2aa60 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
2aa70 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
2aa80 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
2aa90 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
2aaa0 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
2aab0 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
2aac0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
2aad0 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
2aae0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
2aaf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
2ab00 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
2ab10 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
2ab20 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
2ab30 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
2ab40 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
2ab50 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
2ab60 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
2ab70 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2ab80 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aba0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
2abb0 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
2abc0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
2abd0 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
2abe0 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2abf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
2ac00 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
2ac10 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
2ac20 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a  ounter(pList);..
2ac30 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
2ac40 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2ac50 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2ac60 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
2ac70 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
2ac80 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2ac90 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20  BKPT, pData);.. 
2aca0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
2acb0 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
2acc0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2acd0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2ace0 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
2acf0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2ad00 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
2ad10 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
2ad20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
2ad30 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
2ad40 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
2ad50 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
2ad60 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
2ad70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ad80 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
2ad90 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
2ada0 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
2adb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2adc0 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
2add0 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
2ade0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2adf0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
2ae00 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2ae10 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
2ae20 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
2ae30 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
2ae40 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
2ae50 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
2ae60 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2ae70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
2ae80 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
2ae90 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20   pgno;.      }. 
2aea0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
2aeb0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
2aec0 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  ITE]++;..      /
2aed0 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
2aee0 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
2aef0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
2af00 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
2af10 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2af20 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
2af30 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
2af40 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
2af50 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
2af60 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
2af70 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
2af80 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2afa0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2afb0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
2afc0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
2afd0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
2afe0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
2aff0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
2b000 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
2b010 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2b020 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
2b030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
2b040 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
2b050 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
2b060 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2b070 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
2b080 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
2b090 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
2b0a0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
2b0b0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
2b0c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b0d0 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
2b0e0 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
2b0f0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
2b100 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
2b110 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
2b120 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2b130 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
2b140 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2b150 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
2b160 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
2b170 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
2b180 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
2b190 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2b1a0 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
2b1b0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
2b1c0 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
2b1d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
2b1e0 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
2b1f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2b200 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b210 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
2b220 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
2b230 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
2b240 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f  lags =  SQLITE_O
2b250 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
2b260 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2b270 44 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20  DWRITE .      | 
2b280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2b290 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
2b2a0 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20  _EXCLUSIVE .    
2b2b0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2b2c0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
2b2d0 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c     int nStmtSpil
2b2e0 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  l = sqlite3Confi
2b2f0 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20  g.nStmtSpill;.  
2b300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b310 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2b320 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2b330 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
2b340 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2b350 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20       nStmtSpill 
2b360 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2b370 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2b380 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
2b390 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d  pVfs, 0, pPager-
2b3a0 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53  >sjfd, flags, nS
2b3b0 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20  tmtSpill);.  }. 
2b3c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b3d0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
2b3e0 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
2b3f0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
2b400 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
2b410 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a  -journal. .**.**
2b420 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2b430 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
2b440 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
2b450 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
2b460 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
2b470 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
2b480 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2b490 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
2b4a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
2b4b0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
2b4c0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2b4d0 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
2b4e0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
2b4f0 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
2b500 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
2b510 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
2b520 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
2b530 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
2b540 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
2b550 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
2b560 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
2b570 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2b580 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
2b590 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
2b5a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b5b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2b5c0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2b5d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2b5e0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2b5f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2b600 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
2b610 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2b620 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
2b630 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
2b640 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
2b650 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2b660 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
2b670 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2b680 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
2b690 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b6a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2b6b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2b6c0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
2b6d0 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
2b6e0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
2b6f0 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
2b700 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
2b710 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70  ournal(pPager, p
2b720 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
2b730 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
2b740 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
2b750 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
2b760 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
2b770 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
2b780 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2b790 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
2b7a0 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
2b7b0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
2b7c0 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
2b7d0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
2b7e0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2b7f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2b800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b810 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
2b820 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
2b830 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
2b840 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
2b850 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
2b860 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
2b870 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
2b880 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
2b890 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20 69 66  ODEC   .      if
2b8a0 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  ( !pPager->subjI
2b8b0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2b8c0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2b8d0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
2b8e0 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
2b8f0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
2b900 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2b910 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2b920 20 20 20 70 44 61 74 61 32 20 3d 20 70 44 61 74     pData2 = pDat
2b930 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  a;.      PAGERTR
2b940 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
2b950 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
2b960 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2b970 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2b980 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
2b990 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
2b9a0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
2b9b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2b9c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b9e0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2b9f0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
2ba00 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
2ba10 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
2ba20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ba30 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2ba40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ba50 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
2ba60 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
2ba70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2ba80 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
2ba90 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
2baa0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
2bab0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
2bac0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
2bad0 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2bae0 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2baf0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2bb00 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2bb10 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2bb20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e   return subjourn
2bb30 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  alPage(pPg);.  }
2bb40 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2bb50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2bb60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2bb70 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2bb80 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
2bb90 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
2bba0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
2bbb0 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
2bbc0 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
2bbd0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
2bbe0 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
2bbf0 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
2bc00 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
2bc10 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
2bc20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
2bc30 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
2bc40 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
2bc50 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2bc60 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
2bc70 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
2bc80 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
2bc90 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
2bca0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2bcb0 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
2bcc0 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
2bcd0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2bce0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
2bcf0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
2bd00 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
2bd10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
2bd20 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2bd30 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
2bd40 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
2bd50 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
2bd60 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2bd70 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
2bd80 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
2bd90 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
2bda0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2bdb0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
2bdc0 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
2bdd0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2bde0 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
2bdf0 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
2be00 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2be10 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2be20 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2be30 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
2be40 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
2be50 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
2be60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2be70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
2be80 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
2be90 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
2bea0 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
2beb0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2bec0 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2bed0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
2bee0 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
2bef0 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
2bf00 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
2bf10 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
2bf20 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
2bf30 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2bf40 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
2bf50 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
2bf60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2bf70 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2bf80 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
2bf90 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2bfa0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2bfb0 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
2bfc0 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43  oNotSpill NOSYNC
2bfd0 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69   bit is set duri
2bfe0 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2bff0 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2c000 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2c010 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2c020 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2c030 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2c040 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2c050 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2c060 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2c070 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2c080 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2c090 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2c0a0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2c0b0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2c0c0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f  he doNotSpill RO
2c0d0 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62  LLBACK and OFF b
2c0e0 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  its inhibits all
2c0f0 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a   cache spilling.
2c100 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20    ** regardless 
2c110 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
2c120 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
2c130 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
2c140 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61  et during.  ** a
2c150 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20   rollback or by 
2c160 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65  user request, re
2c170 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a  spectively..  **
2c180 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
2c190 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
2c1a0 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
2c1b0 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
2c1c0 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
2c1d0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
2c1e0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
2c1f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
2c200 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a  lementation it .
2c210 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62    ** is impossib
2c220 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63  le for sqlite3Pc
2c230 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62  acheFetch() to b
2c240 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72  e called with cr
2c250 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a  eateFlag==3.  **
2c260 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72   while in the er
2c270 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65  ror state, hence
2c280 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   it is impossibl
2c290 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
2c2a0 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61  ne to.  ** be ca
2c2b0 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f  lled in the erro
2c2c0 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74  r state.  Nevert
2c2d0 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75  heless, we inclu
2c2e0 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a  de a NEVER().  *
2c2f0 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65  * test for the e
2c300 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20  rror state as a 
2c310 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73  safeguard agains
2c320 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
2c330 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2c340 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2c350 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  de) ) return SQL
2c360 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61  ITE_OK;.  testca
2c370 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2c380 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2c390 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  AG_ROLLBACK );. 
2c3a0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2c3b0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2c3c0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b  SPILLFLAG_OFF );
2c3d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2c3e0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2c3f0 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59  & SPILLFLAG_NOSY
2c400 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  NC );.  if( pPag
2c410 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20  er->doNotSpill. 
2c420 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64    && ((pPager->d
2c430 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49  oNotSpill & (SPI
2c440 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c  LLFLAG_ROLLBACK|
2c450 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21  SPILLFLAG_OFF))!
2c460 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  =0.      || (pPg
2c470 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
2c480 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20  NEED_SYNC)!=0). 
2c490 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c4a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2c4b0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
2c4c0 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
2c4d0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
2c4e0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
2c4f0 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
2c500 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
2c510 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
2c520 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49   subjournalPageI
2c530 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20  fRequired(pPg); 
2c540 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c560 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
2c570 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
2c580 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2c590 7d 65 6c 73 65 7b 0a 20 20 20 20 0a 23 69 66 64  }else{.    .#ifd
2c5a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2c5b0 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
2c5c0 49 54 45 0a 20 20 20 20 69 66 28 20 70 50 61 67  ITE.    if( pPag
2c5d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
2c5e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2c5f0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
2c600 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
2c610 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2c620 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2c630 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2c640 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d  ager, rc);.    }
2c650 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 2f  .#endif.  .    /
2c660 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
2c670 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
2c680 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2c690 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2c6a0 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
2c6b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2c6c0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2c6d0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
2c6e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
2c6f0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2c700 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
2c710 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2c720 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2c730 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2c740 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2c750 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c760 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2c770 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2c780 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2c790 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2c7a0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2c7b0 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2c7c0 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2c7d0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2c7e0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2c7f0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2c800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2c810 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2c820 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2c830 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2c840 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2c850 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2c860 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2c870 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2c880 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2c890 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  , rc); .}../*.**
2c8a0 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66   Flush all unref
2c8b0 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70 61  erenced dirty pa
2c8c0 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ges to disk..*/.
2c8d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2c8e0 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50 61  Flush(Pager *pPa
2c8f0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2c900 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2c910 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
2c920 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69  {.    PgHdr *pLi
2c930 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
2c940 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2c950 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2c960 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2c970 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2c980 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c  ger) );.    whil
2c990 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2c9a0 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
2c9b0 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
2c9c0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
2c9d0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2c9e0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2c9f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
2ca00 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61  tress((void*)pPa
2ca10 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  ger, pList);.   
2ca20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74     }.      pList
2ca30 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   = pNext;.    }.
2ca40 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2ca50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2ca60 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2ca70 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
2ca80 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
2ca90 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
2caa0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
2cab0 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
2cac0 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
2cad0 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
2cae0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
2caf0 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
2cb00 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
2cb10 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2cb20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
2cb30 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2cb40 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
2cb50 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
2cb60 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
2cb70 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2cb80 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
2cb90 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
2cba0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
2cbb0 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
2cbc0 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
2cbd0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2cbe0 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
2cbf0 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
2cc00 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
2cc10 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
2cc20 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
2cc30 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
2cc40 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2cc50 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
2cc60 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
2cc70 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
2cc80 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2cc90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
2cca0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
2ccb0 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
2ccc0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
2ccd0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
2cce0 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
2ccf0 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
2cd00 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
2cd10 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
2cd20 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
2cd30 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2cd40 45 78 74 72 61 28 29 20 41 50 49 2e 20 20 57 68  Extra() API.  Wh
2cd50 65 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69 73  en a new page is
2cd60 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a   allocated, the.
2cd70 2a 2a 20 66 69 72 73 74 20 38 20 62 79 74 65 73  ** first 8 bytes
2cd80 20 6f 66 20 74 68 69 73 20 73 70 61 63 65 20 61   of this space a
2cd90 72 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74 68  re zeroed but th
2cda0 65 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20 75  e remainder is u
2cdb0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a  ninitialized..**
2cdc0 20 28 54 68 65 20 65 78 74 72 61 20 73 70 61 63   (The extra spac
2cdd0 65 20 69 73 20 75 73 65 64 20 62 79 20 62 74 72  e is used by btr
2cde0 65 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61 67  ee as the MemPag
2cdf0 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a  e object.).**.**
2ce00 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
2ce10 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
2ce20 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
2ce30 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
2ce40 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
2ce50 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
2ce60 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
2ce70 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
2ce80 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
2ce90 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  the PAGER_* flag
2cea0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
2ceb0 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
2cec0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
2ced0 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
2cee0 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
2cef0 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
2cf00 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
2cf10 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
2cf20 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
2cf30 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
2cf40 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
2cf50 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
2cf60 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
2cf70 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
2cf80 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
2cf90 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
2cfa0 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
2cfb0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
2cfc0 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
2cfd0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2cfe0 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
2cff0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
2d000 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
2d010 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
2d020 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2d030 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
2d040 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
2d050 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
2d060 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
2d070 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2d080 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
2d090 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
2d0a0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
2d0b0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
2d0c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2d0d0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
2d0e0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
2d0f0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
2d100 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
2d110 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2d120 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
2d130 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
2d140 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2d150 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
2d160 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2d170 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2d180 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
2d190 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
2d1a0 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
2d1b0 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
2d1c0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2d1d0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d1f0 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
2d200 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
2d210 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
2d220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2d230 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
2d240 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
2d250 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
2d260 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
2d270 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
2d280 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
2d290 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
2d2a0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
2d2b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
2d2c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
2d2d0 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
2d2e0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
2d2f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d300 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
2d310 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2d320 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
2d330 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d340 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
2d350 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
2d360 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
2d370 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
2d380 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d390 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2d3a0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
2d3b0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
2d3c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d3d0 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
2d3e0 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
2d3f0 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
2d400 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
2d410 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2d420 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2d430 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
2d440 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2d450 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
2d460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2d470 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
2d480 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
2d490 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2d4a0 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
2d4b0 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
2d4c0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
2d4d0 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
2d4e0 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
2d4f0 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
2d500 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
2d510 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2d520 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
2d530 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2d540 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
2d550 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c  .  u32 szPageDfl
2d560 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2d570 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
2d580 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
2d590 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ize */.  const c
2d5a0 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20  har *zUri = 0;  
2d5b0 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f    /* URI args to
2d5c0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   copy */.  int n
2d5d0 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Uri = 0;        
2d5e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d5f0 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72   bytes of URI ar
2d600 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a  gs at *zUri */..
2d610 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
2d620 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
2d630 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  s required for e
2d640 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ach journal file
2d650 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68  -handle.  ** (th
2d660 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74  ere are two of t
2d670 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f  hem, the main jo
2d680 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75  urnal and the su
2d690 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a  b-journal).  */.
2d6a0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2d6b0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2d6c0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2d6d0 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  fs));..  /* Set 
2d6e0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2d6f0 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2d700 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2d710 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2d720 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2d730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2d740 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2d750 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2d760 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2d770 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  1;.    if( zFile
2d780 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2d790 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50  e[0] ){.      zP
2d7a0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2d7b0 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69  3DbStrDup(0, zFi
2d7c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
2d7d0 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2d7e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2d7f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2d800 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2d810 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2d820 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2d830 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2d840 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2d850 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2d860 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2d870 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2d880 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2d890 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2d8a0 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2d8b0 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2d8c0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2d8d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2d8e0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2d8f0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2d900 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2d910 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2d920 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2d930 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2d940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2d950 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2d960 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2d970 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2d980 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
2d990 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e  locRaw(0, nPathn
2d9a0 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
2d9b0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
2d9c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d9d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2d9e0 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e      }.    zPathn
2d9f0 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d  ame[0] = 0; /* M
2da00 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c  ake sure initial
2da10 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c  ized even if Ful
2da20 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c  lPathname() fail
2da30 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  s */.    rc = sq
2da40 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
2da50 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2da60 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
2da70 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2da80 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2da90 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2daa0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  hname);.    z = 
2dab0 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d  zUri = &zFilenam
2dac0 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
2dad0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b  0(zFilename)+1];
2dae0 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
2daf0 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  {.      z += sql
2db00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2db10 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  1;.      z += sq
2db20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2db30 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55  +1;.    }.    nU
2db40 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d  ri = (int)(&z[1]
2db50 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73   - zUri);.    as
2db60 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b  sert( nUri>=0 );
2db70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2db80 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
2db90 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
2dba0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
2dbb0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
2dbc0 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
2dbd0 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
2dbe0 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2dbf0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2dc00 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
2dc10 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
2dc20 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
2dc30 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
2dc40 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
2dc50 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
2dc60 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
2dc70 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
2dc80 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
2dc90 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
2dca0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2dcb0 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
2dcc0 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
2dcd0 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
2dce0 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
2dcf0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2dd00 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2dd10 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
2dd20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dd30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2dd40 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2dd50 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
2dd60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
2dd70 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2dd80 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50  memory for the P
2dd90 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
2dda0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74  PCache object, t
2ddb0 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69  he.  ** three fi
2ddc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
2ddd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dde0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a  e name and the j
2ddf0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
2de00 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f  e name. The layo
2de10 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20  ut in memory is 
2de20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
2de30 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20  .  **     Pager 
2de40 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2de50 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
2de60 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a  f(Pager) bytes).
2de70 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20    **     PCache 
2de80 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2de90 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2dea0 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79  3PcacheSize() by
2deb0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2dec0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
2ded0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70  le            (p
2dee0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79  Vfs->szOsFile by
2def0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75  tes).  **     Su
2df00 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  b-journal file h
2df10 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a  andle         (j
2df20 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2df30 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d  ytes).  **     M
2df40 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
2df50 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28   handle        (
2df60 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2df70 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2df80 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  Database file na
2df90 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2dfa0 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74  (nPathname+1 byt
2dfb0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75  es).  **     Jou
2dfc0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20  rnal file name  
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2dfe0 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65  athname+8+1 byte
2dff0 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d  s).  */.  pPtr =
2e000 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61   (u8 *)sqlite3Ma
2e010 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f  llocZero(.    RO
2e020 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2e030 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20  ger)) +      /* 
2e040 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2e050 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63  */.    ROUND8(pc
2e060 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20  acheSize) +     
2e070 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
2e080 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f  object */.    RO
2e090 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2e0a0 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  ile) +       /* 
2e0b0 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
2e0c0 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
2e0d0 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
2e0e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
2e0f0 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
2e100 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  */ .    nPathnam
2e110 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20  e + 1 + nUri +  
2e120 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
2e130 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68  ame */.    nPath
2e140 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20  name + 8 + 2    
2e150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f            /* zJo
2e160 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
2e170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2e180 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65  .    + nPathname
2e190 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20   + 4 + 2        
2e1a0 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
2e1b0 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
2e1c0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2e1d0 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
2e1e0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
2e1f0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
2e200 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
2e210 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e220 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2e230 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e240 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2e250 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2e260 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2e270 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2e280 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2e290 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2e2a0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2e2b0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2e2c0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2e2d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2e2e0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2e2f0 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2e300 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2e310 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2e320 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2e330 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2e340 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2e350 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2e360 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2e370 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2e380 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2e390 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2e3a0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2e3b0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2e3c0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2e3d0 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2e3e0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2e3f0 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2e400 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2e410 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2e420 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2e430 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2e440 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e450 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2e460 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2e470 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2e480 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2e490 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2e4a0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2e4b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2e4c0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2e4d0 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  e);.    if( nUri
2e4e0 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65   ) memcpy(&pPage
2e4f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
2e500 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c  thname+1], zUri,
2e510 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2e520 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
2e530 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
2e540 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2e550 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2e560 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2e570 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30  me], "-journal\0
2e580 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73  00", 8+2);.    s
2e590 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2e5a0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2e5b0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ame, pPager->zJo
2e5c0 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20  urnal);.#ifndef 
2e5d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2e5e0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c      pPager->zWal
2e5f0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   = &pPager->zJou
2e600 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38  rnal[nPathname+8
2e610 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1];.    memcpy(
2e620 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
2e630 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2e640 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2e650 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2e660 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c  athname], "-wal\
2e670 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20  000", 4+1);.    
2e680 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2e690 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2e6a0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57  name, pPager->zW
2e6b0 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  al);.#endif.    
2e6c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2e6d0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d   zPathname);.  }
2e6e0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
2e6f0 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
2e700 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
2e710 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
2e720 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
2e730 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2e740 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2e750 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
2e760 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
2e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e780 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
2e790 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
2e7a0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2e7b0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2e7c0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e7d0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
2e7e0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
2e7f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65  .    assert( !me
2e800 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f  mDb );.    readO
2e810 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2e820 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e830 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2e840 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2e850 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2e860 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2e870 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2e880 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2e890 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2e8a0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2e8b0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2e8c0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2e8d0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2e8e0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2e8f0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2e900 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2e910 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e920 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2e930 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2e940 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2e950 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2e960 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2e970 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2e980 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2e990 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2e9a0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2e9b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e9c0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2e9d0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2e9e0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2e9f0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2ea00 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2ea10 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2ea20 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2ea30 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2ea40 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2ea50 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2ea60 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2ea70 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2ea80 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2ea90 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2eaa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2eab0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2eac0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2ead0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2eae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2eaf0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2eb00 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2eb10 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2eb20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2eb30 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2eb40 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2eb50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2eb60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2eb70 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2eb80 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2eb90 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2eba0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2ebb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2ebc0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2ebd0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2ebe0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2ebf0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2ec00 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2ec10 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2ec20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2ec30 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2ec40 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2ec50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2ec60 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2ec70 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2ec80 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2ec90 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2eca0 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2ecb0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2ecc0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2ecd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2ece0 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ed00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ed10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2ed20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2ed30 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2ed40 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2ed50 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2ed60 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2ed70 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2ed80 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2ed90 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2eda0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2edb0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2edc0 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2edd0 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2ede0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2edf0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2ee00 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2ee10 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2ee20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2ee30 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2ee40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2ee50 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2ee60 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2ee70 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2ee80 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2ee90 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2eea0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2eeb0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2eec0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2eed0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2eee0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2eef0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2ef00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2ef10 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2ef20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2ef30 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2ef40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2ef50 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2ef60 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2ef70 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2ef80 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2ef90 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2efa0 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2efb0 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2efc0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2efd0 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2efe0 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2eff0 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2f000 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2f010 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2f020 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2f030 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2f040 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2f050 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2f060 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2f070 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2f080 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2f090 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2f0a0 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2f0b0 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2f0c0 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20   EXCLUSIVE mode 
2f0d0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2f0e0 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2f0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2f100 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2f110 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2f120 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2f130 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2f140 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2f150 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2f160 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2f170 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2f180 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2f190 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2f1a0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2f1b0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2f1c0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2f1d0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2f1e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2f1f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2f200 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2f210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2f220 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2f230 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2f240 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2f250 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f260 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2f270 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2f280 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2f290 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f2a0 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20  K ){.    nExtra 
2f2b0 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
2f2c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
2f2d0 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72  xtra>=8 && nExtr
2f2e0 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63  a<1000 );.    rc
2f2f0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2f300 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2f310 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2f320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f330 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2f340 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2f350 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2f360 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2f370 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2f380 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61  error occurred a
2f390 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20  bove, free the  
2f3a0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2f3b0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2f3c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2f3d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f3e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2f3f0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2f400 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
2f410 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
2f420 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  Space);.    sqli
2f430 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2f440 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2f450 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2f460 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2f470 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2f480 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2f490 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2f4a0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2f4b0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2f4c0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2f4d0 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2f4e0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2f4f0 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2f500 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2f510 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2f520 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2f530 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2f540 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2f550 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f560 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2f570 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f580 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2f590 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f5a0 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2f5b0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2f5c0 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2f5d0 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
2f5e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2f5f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
2f600 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
2f610 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
2f620 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2f630 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2f640 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
2f650 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2f660 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
2f670 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
2f680 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2f690 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2f6a0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2f6b0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2f6c0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
2f6d0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
2f6e0 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
2f6f0 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
2f700 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2f710 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
2f720 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2f730 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
2f740 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
2f750 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
2f760 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
2f770 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
2f780 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2f790 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
2f7a0 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
2f7b0 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
2f7c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2f7d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2f7e0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30  ger->fullSync==0
2f7f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f800 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
2f810 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2f820 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
2f830 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2f840 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f850 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
2f860 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2f870 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2f880 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2f890 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b  ->extraSync = 0;
2f8a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
2f8b0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2f8c0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
2f8d0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2f8e0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2f8f0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51  YNC_NORMAL | (SQ
2f900 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2f910 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  <<2);.  }.  /* p
2f920 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
2f930 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f940 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
2f950 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f960 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
2f970 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
2f980 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
2f990 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
2f9a0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
2f9b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
2f9c0 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
2f9d0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
2f9e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2f9f0 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
2fa00 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2fa10 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
2fa20 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2fa30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2fa40 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2fa50 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
2fa60 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
2fa70 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2fa80 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2fa90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2faa0 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
2fab0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
2fac0 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
2fad0 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
2fae0 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
2faf0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
2fb00 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
2fb10 0a 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68  .  setGetterMeth
2fb20 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  od(pPager);.  /*
2fb30 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
2fb40 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
2fb50 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
2fb60 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2fb70 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54  ->szMmap = SQLIT
2fb80 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53  E_DEFAULT_MMAP_S
2fb90 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73  IZE // will be s
2fba0 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f  et by btree.c */
2fbb0 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
2fbc0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
2fbd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
2fbe0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
2fbf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fc00 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74  has not be delet
2fc10 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75  ed or renamed ou
2fc20 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20  t from.** under 
2fc30 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75  the pager.  Retu
2fc40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2fc50 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2fc60 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75  still were it ou
2fc70 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20  ght.** to be on 
2fc80 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f  disk.  Return no
2fc90 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52  n-zero (SQLITE_R
2fca0 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20  EADONLY_DBMOVED 
2fcb0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
2fcc0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d  ror.** code from
2fcd0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2fce0 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62  ()) if the datab
2fcf0 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73  ase has gone mis
2fd00 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
2fd10 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e  int databaseIsUn
2fd20 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61  moved(Pager *pPa
2fd30 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73  ger){.  int bHas
2fd40 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74  Moved = 0;.  int
2fd50 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
2fd60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72  er->tempFile ) r
2fd70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2fd80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2fd90 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72  bSize==0 ) retur
2fda0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
2fdb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a  ssert( pPager->z
2fdc0 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67  Filename && pPag
2fdd0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
2fde0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2fdf0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
2fe00 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
2fe10 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56  TE_FCNTL_HAS_MOV
2fe20 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b  ED, &bHasMoved);
2fe30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fe40 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
2fe50 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f    /* If the HAS_
2fe60 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  MOVED file-contr
2fe70 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e  ol is unimplemen
2fe80 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ted, assume that
2fe90 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
2fea0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f   has not been mo
2feb0 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68  ved.  That is th
2fec0 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68  e historical beh
2fed0 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a  avior of SQLite:
2fee0 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a   prior to.    **
2fef0 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20   version 3.8.3, 
2ff00 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64  it never checked
2ff10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
2ff20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
2ff30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ff40 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29  K && bHasMoved )
2ff50 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2ff60 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2ff70 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ED;.  }.  return
2ff80 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2ff90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ffa0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
2ffb0 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
2ffc0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
2ffd0 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
2ffe0 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
2fff0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
30000 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
30010 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
30020 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
30030 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
30040 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
30050 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
30060 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
30070 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
30080 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
30090 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
300a0 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
300b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
300c0 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
300d0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
300e0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
300f0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
30100 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
30110 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
30120 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
30130 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
30140 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30150 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
30160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30170 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
30180 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
30190 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
301a0 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
301b0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
301c0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
301d0 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
301e0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
301f0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
30200 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
30210 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
30220 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
30230 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
30240 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
30250 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
30260 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
30270 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
30280 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
30290 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
302a0 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
302b0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
302c0 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
302d0 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
302e0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
302f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
30300 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
30310 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
30320 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
30330 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
30340 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
30350 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
30360 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
30370 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
30380 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
30390 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
303a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
303b0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
303c0 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
303d0 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
303e0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
303f0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
30400 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
30410 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
30420 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
30430 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
30440 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
30450 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
30460 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
30470 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
30480 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
30490 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
304a0 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
304b0 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
304c0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
304d0 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
304e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
304f0 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
30500 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
30510 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
30520 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
30530 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
30540 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
30550 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
30560 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
30570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30580 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
30590 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
305a0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
305b0 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
305c0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
305d0 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
305e0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
305f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
30600 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
30610 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
30620 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
30630 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
30640 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30650 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30660 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
30670 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
30680 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30690 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
306a0 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
306b0 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
306c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
306d0 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
306e0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
306f0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
30700 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
30710 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
30720 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30730 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
30740 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
30750 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
30760 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
30770 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
30780 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
30790 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
307a0 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
307b0 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
307c0 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
307d0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
307e0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
307f0 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
30800 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
30810 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
30820 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
30830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30840 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
30850 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
30860 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
30870 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
30880 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
30890 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
308a0 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
308b0 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
308c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
308d0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
308e0 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
308f0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
30900 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
30910 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
30920 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
30930 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
30940 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
30950 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
30960 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
30970 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
30980 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
30990 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
309a0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
309b0 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
309c0 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
309d0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
309e0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
309f0 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
30a00 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
30a10 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
30a20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
30a30 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
30a40 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
30a50 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
30a60 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
30a70 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
30a80 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
30a90 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
30aa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30ab0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
30ac0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
30ad0 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
30ae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30af0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
30b00 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
30b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30b30 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
30b40 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ile */..      as
30b50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
30b60 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  mpFile==0 );.   
30b70 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
30b80 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
30b90 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
30ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30bb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
30bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
30bd0 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
30be0 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
30bf0 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
30c00 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
30c10 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
30c20 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
30c30 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
30c40 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
30c50 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
30c60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30c70 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
30c80 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
30c90 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
30ca0 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
30cb0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
30cc0 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
30cd0 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
30ce0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
30cf0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
30d00 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
30d10 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
30d20 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
30d30 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
30d40 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
30d50 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
30d60 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
30d70 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
30d80 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
30d90 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
30da0 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
30db0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
30dc0 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
30dd0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
30de0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
30df0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
30e00 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
30e10 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
30e20 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
30e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
30e50 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
30e60 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30e70 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
30e80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
30e90 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
30ea0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
30eb0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
30ec0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30ed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
30ee0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
30ef0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30f20 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
30f30 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
30f40 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
30f50 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
30f60 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
30f70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
30f80 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
30f90 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
30fa0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
30fb0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
30fc0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
30fd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30fe0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
30ff0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
31000 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
31010 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
31020 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
31030 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
31040 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
31050 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31060 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
31070 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
31080 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
31090 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
310a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
310b0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
310c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
310d0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
310e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
310f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
31100 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
31110 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
31120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31130 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
31140 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
31150 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31160 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
31170 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
31180 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
31190 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
311a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
311b0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
311c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
311d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
311e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
311f0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
31200 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
31210 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
31220 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
31230 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31240 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
31250 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
31260 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
31270 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31280 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
31290 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
312a0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
312b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
312c0 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
312d0 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
312e0 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
312f0 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
31300 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
31310 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
31320 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
31330 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
31340 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
31350 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
31360 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
31370 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31380 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
31390 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
313a0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
313b0 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
313c0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
313d0 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
313e0 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
313f0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
31400 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
31410 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
31420 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
31430 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
31440 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
31450 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
31460 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
31470 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
31480 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
31490 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
314a0 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
314b0 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
314c0 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
314d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
314e0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
314f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31520 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
31530 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
31540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
31550 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
31560 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
31570 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
31580 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31590 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
315a0 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
315b0 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69  3PagerGet() unti
315c0 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
315d0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
315e0 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
315f0 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
31600 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
31610 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
31620 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
31630 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
31640 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
31650 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
31660 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
31670 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
31680 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
31690 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
316a0 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
316b0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
316c0 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
316d0 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
316e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
316f0 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
31700 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
31710 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
31720 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
31730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31740 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
31750 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
31760 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
31770 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
31780 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
31790 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
317a0 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
317b0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
317c0 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
317d0 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
317e0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
317f0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
31800 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
31810 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
31820 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
31830 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
31840 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
31850 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31860 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
31870 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
31880 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
31890 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
318a0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
318b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
318c0 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
318d0 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
318e0 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
318f0 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
31900 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
31910 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
31920 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
31930 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
31940 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
31950 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
31960 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
31970 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
31980 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
31990 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
319a0 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
319b0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
319c0 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
319d0 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
319e0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
319f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
31a00 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
31a10 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
31a20 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
31a30 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
31a40 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
31a50 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
31a60 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
31a70 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
31a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
31a90 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
31aa0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
31ab0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
31ac0 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
31ad0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
31ae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
31b10 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
31b20 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
31b30 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
31b40 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
31b50 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
31b60 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
31b70 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
31b80 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
31b90 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
31ba0 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
31bb0 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
31bc0 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
31bd0 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
31be0 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
31bf0 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
31c00 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  ess mode.  */.  
31c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
31c20 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
31c30 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
31c40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
31c50 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
31c60 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
31c70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31c80 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
31c90 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
31ca0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
31cb0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
31cc0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
31cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
31ce0 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
31cf0 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
31d00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
31d10 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e  R_OPEN ){.    in
31d20 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20  t bHotJournal = 
31d30 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  1;          /* T
31d40 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69  rue if there exi
31d50 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  sts a hot journa
31d60 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61  l-file */..    a
31d70 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
31d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31d90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
31da0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
31db0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
31dc0 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  K );..    rc = p
31dd0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
31de0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
31df0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
31e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31e10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31e20 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
31e30 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
31e40 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
31e50 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f  LOCK );.      go
31e60 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
31e70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
31e80 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
31e90 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
31ea0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
31eb0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
31ec0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
31ed0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
31ee0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
31ef0 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
31f00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31f10 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
31f20 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
31f30 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
31f40 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
31f50 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
31f60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
31f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31f80 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31f90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
31fa0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
31fb0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72     if( pPager->r
31fc0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
31fd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
31fe0 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
31ff0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
32000 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
32010 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
32020 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
32030 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
32040 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
32050 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
32060 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
32070 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
32080 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
32090 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
320a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
320b0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
320c0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
320d0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
320e0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
320f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
32100 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
32110 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
32120 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
32130 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
32140 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
32150 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
32160 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
32170 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
32180 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
32190 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
321a0 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
321b0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
321c0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
321d0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
321e0 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
321f0 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
32200 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
32210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32220 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
32230 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
32240 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
32250 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
32260 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
32270 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
32280 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
32290 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
322a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
322b0 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
322c0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
322d0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
322e0 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20  the lock is.    
322f0 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20    ** downgraded 
32300 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62  to SHARED_LOCK b
32310 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
32320 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20  ion returns..   
32330 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
32340 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
32350 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
32360 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
32370 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32380 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
32390 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  iled;.      }. .
323a0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
323b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
323c0 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  en and the file 
323d0 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
323e0 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  open the .      
323f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  ** journal for r
32400 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
32410 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69  . Write access i
32420 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
32430 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  se .      ** in 
32440 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
32450 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
32460 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
32470 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20  e kept open .   
32480 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62     ** and possib
32490 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
324a0 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
324b0 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d  on. Also, write-
324c0 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  access .      **
324d0 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75   is usually requ
324e0 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ired to finalize
324f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   the journal in 
32500 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72  journal_mode=per
32510 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  sist .      ** m
32520 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f  ode (and also fo
32530 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74  r journal_mode=t
32540 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20  runcate on some 
32550 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20  systems)..      
32560 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
32570 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
32580 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
32590 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
325a0 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20   some .      ** 
325b0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
325c0 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
325d0 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
325e0 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
325f0 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
32600 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
32610 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
32620 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
32630 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
32640 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
32650 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
32660 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
32670 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
32680 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
32690 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
326a0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
326b0 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
326c0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
326d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
326e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
326f0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
32700 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
32710 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69          int bExi
32720 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
32730 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
32740 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
32750 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
32760 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
32770 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
32780 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
32790 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
327a0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78  ESS_EXISTS, &bEx
327b0 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69  ists);.        i
327c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
327d0 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
327e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
327f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
32800 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
32810 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
32820 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32830 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
32840 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
32850 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
32860 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32870 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
32880 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32890 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
328a0 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
328b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
328c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
328d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
328e0 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
328f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32900 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
32910 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
32920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
32930 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
32940 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
32950 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
32960 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
32970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
32980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32990 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
329a0 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
329b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
329c0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
329d0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
329e0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
329f0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
32a00 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
32a10 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
32a20 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
32a30 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
32a40 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
32a50 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
32a60 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
32a70 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
32a80 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
32a90 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
32aa0 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
32ab0 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
32ac0 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
32ad0 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
32ae0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
32af0 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
32b00 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
32b10 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
32b20 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
32b30 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
32b40 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
32b50 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
32b60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
32b70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32b80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
32b90 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
32ba0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
32bb0 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
32bc0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
32bd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
32be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32bf0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
32c00 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
32c10 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  r, !pPager->temp
32c20 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
32c30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32c40 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
32c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
32c60 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
32c70 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
32c80 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
32c90 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
32ca0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
32cb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
32cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32cd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
32ce0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
32cf0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
32d00 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
32d10 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
32d20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
32d30 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
32d40 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
32d50 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
32d60 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
32d70 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
32d80 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
32d90 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
32da0 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
32db0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
32dc0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
32dd0 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
32de0 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
32df0 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
32e00 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
32e10 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
32e20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
32e30 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
32e40 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
32e50 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
32e60 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
32e70 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
32e80 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
32e90 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
32ea0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
32eb0 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
32ec0 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
32ed0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
32ee0 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
32ef0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
32f00 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
32f10 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
32f20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
32f30 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
32f40 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
32f50 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
32f60 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
32f70 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
32f80 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
32f90 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
32fa0 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
32fb0 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
32fc0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
32fd0 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
32fe0 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
32ff0 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
33000 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
33010 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
33020 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
33030 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
33040 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
33050 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
33060 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
33070 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
33080 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
33090 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
330a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
330b0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
330c0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
330d0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
330e0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
330f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33100 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
33110 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
33120 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
33130 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
33140 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
33150 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
33160 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
33170 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
33180 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
33190 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
331a0 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72  mpFile && pPager
331b0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
331c0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
331d0 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
331e0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
331f0 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
33200 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
33210 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
33220 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
33230 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
33240 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
33250 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
33260 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
33270 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  e hasHeldSharedL
33280 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74  ock flag prevent
33290 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  s this from.    
332a0 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f    ** occurring o
332b0 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  n the very first
332c0 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c   access to a fil
332d0 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  e, in order to s
332e0 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ave a.      ** s
332f0 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72  ingle unnecessar
33300 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  y sqlite3OsRead(
33310 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74  ) call at the st
33320 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a  art-up..      **
33330 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
33340 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64  se changes are d
33350 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
33360 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
33370 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
33380 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
33390 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
333a0 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
333b0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
333c0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
333d0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
333e0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
333f0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
33400 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
33410 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
33420 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
33430 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
33440 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
33450 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
33460 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
33470 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
33480 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
33490 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
334a0 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
334b0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
334c0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
334d0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
334e0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
334f0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
33500 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
33510 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
33520 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  */.      char db
33530 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
33540 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
33550 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54  rs)];..      IOT
33560 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
33570 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
33580 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
33590 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  s)));.      rc =
335a0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
335b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
335c0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
335d0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
335e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
335f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33610 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
33620 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
33630 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
33640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33650 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
33660 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
33670 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
33680 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
33690 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
336a0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
336b0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
336c0 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
336d0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
336e0 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
336f0 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
33700 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33710 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
33720 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
33730 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
33740 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
33750 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
33760 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
33770 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
33780 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
33790 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
337a0 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
337b0 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
337c0 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
337d0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
337e0 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
337f0 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
33800 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
33810 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
33820 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
33830 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
33840 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
33850 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
33860 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
33870 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
33880 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
33890 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
338a0 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
338b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
338c0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
338d0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
338e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
338f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
33900 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
33910 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
33920 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
33930 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
33940 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
33950 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
33960 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
33970 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
33980 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
33990 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
339a0 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
339b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
339c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
339d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
339e0 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
339f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
33a00 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
33a10 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33a20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
33a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33a40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
33a50 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
33a60 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
33a70 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
33a80 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70  tempFile==0 && p
33a90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33aa0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
33ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33ac0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
33ad0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
33ae0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
33af0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
33b00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33b10 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
33b20 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
33b30 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
33b40 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
33b50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33b60 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
33b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
33b80 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
33b90 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
33ba0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
33bb0 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
33bc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
33bd0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
33be0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
33bf0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
33c00 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
33c10 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
33c20 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
33c30 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
33c40 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
33c50 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
33c60 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
33c70 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
33c80 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
33c90 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
33ca0 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
33cb0 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
33cc0 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
33cd0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
33ce0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
33cf0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
33d00 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
33d10 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
33d20 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71  Pager){.  if( sq
33d30 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
33d40 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
33d50 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  che)==0 ){.    a
33d60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
33d70 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a  MmapOut==0 ); /*
33d80 20 62 65 63 61 75 73 65 20 70 61 67 65 31 20 69   because page1 i
33d90 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d  s never memory m
33da0 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67  apped */.    pag
33db0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
33dc0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
33dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
33de0 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  ge getter method
33df0 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63  s each try to ac
33e00 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
33e10 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77  e to a.** page w
33e20 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ith page number 
33e30 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71  pgno. If the req
33e40 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
33e50 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
33e60 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
33e70 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
33e80 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
33e90 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
33ea0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64  *.** There are d
33eb0 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65  ifferent impleme
33ec0 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
33ed0 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65  getter method de
33ee0 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  pending.** on th
33ef0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
33f00 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  of the pager..**
33f10 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e  .**     getPageN
33f20 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20  ormal()         
33f30 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67  --  The normal g
33f40 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74  etter.**     get
33f50 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20  PageError()     
33f60 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66       --  Used if
33f70 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
33f80 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a   an error state.
33f90 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d  **     getPageMm
33fa0 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d  ap()           -
33fb0 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72  -  Used if memor
33fc0 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
33fd0 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66  enabled.**.** If
33fe0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
33ff0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
34000 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
34010 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
34020 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
34030 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
34040 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
34050 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
34060 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
34070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34080 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
34090 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
340a0 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
340b0 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
340c0 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
340d0 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
340e0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
340f0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
34100 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
34110 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
34120 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
34130 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
34140 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
34150 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
34160 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
34170 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
34180 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
34190 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
341a0 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
341b0 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
341c0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
341d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
341e0 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
341f0 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
34200 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
34210 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
34220 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
34230 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
34240 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
34250 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
34260 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
34270 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20  f .** the flags 
34280 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
34290 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  ns the PAGER_GET
342a0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61  _NOCONTENT bit a
342b0 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
342c0 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
342d0 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
342e0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
342f0 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
34300 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
34310 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
34320 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
34330 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
34340 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
34350 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
34360 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45  *.** If PAGER_GE
34370 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74  T_NOCONTENT is t
34380 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
34390 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
343a0 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
343b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
343c0 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
343d0 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
343e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
343f0 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
34400 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
34410 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
34420 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
34430 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
34440 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
34450 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
34460 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
34470 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
34480 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
34490 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
344a0 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
344b0 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
344c0 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
344d0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45  l..**.** If PAGE
344e0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
344f0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
34500 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
34510 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
34520 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65  d.** of being re
34530 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
34540 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
34550 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
34560 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
34570 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
34580 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
34590 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
345a0 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
345b0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
345c0 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
345d0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
345e0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
345f0 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
34600 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
34610 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
34620 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
34630 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
34640 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
34650 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
34660 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
34670 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
34680 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
34690 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
346a0 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
346b0 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
346c0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
346d0 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
346e0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
346f0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
34700 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
34710 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
34720 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
34730 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
34740 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
34750 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34760 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
34770 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
34780 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
34790 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
347a0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
347b0 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
347c0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
347d0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
347e0 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
347f0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
34800 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
34810 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
34820 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
34830 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
34840 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
34850 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
34860 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
34870 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
34880 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
34890 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
348a0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
348b0 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
348c0 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
348d0 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
348e0 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
348f0 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
34900 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73  rnal files..*/.s
34910 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
34920 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72  eNormal(.  Pager
34930 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
34940 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
34950 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34960 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
34970 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
34980 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
34990 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
349a0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
349b0 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
349c0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
349d0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
349e0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
349f0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
34a00 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
34a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34a20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
34a30 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20  u8 noContent;   
34a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a50 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52  /* True if PAGER
34a60 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
34a70 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74  s set */.  sqlit
34a80 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
34a90 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74  pBase;..  assert
34aa0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
34ab0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
34ac0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34ad0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34ae0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
34af0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
34b00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
34b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34b20 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
34b30 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69  dLock==1 );..  i
34b40 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
34b50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
34b60 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65  PT_BKPT;.  pBase
34b70 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34b80 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
34b90 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
34ba0 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20  .  if( pBase==0 
34bb0 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
34bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34bd0 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
34be0 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
34bf0 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
34c00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34c10 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34c20 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34c30 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d  ;.    if( pBase=
34c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
34c50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
34c60 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
34c70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
34c90 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
34ca0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34cb0 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
34cc0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
34cd0 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ase);.  assert( 
34ce0 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
34cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
34d00 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
34d10 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
34d20 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
34d30 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
34d40 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d  ;..  noContent =
34d50 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
34d60 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d  GET_NOCONTENT)!=
34d70 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  0;.  if( pPg->pP
34d80 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
34d90 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
34da0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
34db0 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
34dc0 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
34dd0 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
34de0 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
34df0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
34e00 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
34e10 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
34e20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
34e30 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
34e40 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
34e50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
34e60 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
34e70 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
34e80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
34e90 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
34ea0 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
34eb0 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
34ec0 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
34ed0 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
34ee0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
34ef0 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65  . But first some
34f00 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20   error checks:. 
34f10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
34f20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
34f30 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
34f40 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65  .    ** (2) Neve
34f50 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
34f60 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
34f70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
34f80 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
34f90 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
34fa0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
34fb0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
34fc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34fd0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
34fe0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34ff0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  r;.    }..    pP
35000 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
35010 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  er;..    assert(
35020 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
35030 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29  >fd) || !MEMDB )
35040 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
35050 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
35060 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
35070 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
35080 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
35090 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
350a0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
350b0 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
350c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
350d0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
350e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
350f0 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
35100 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
35110 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
35120 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
35130 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
35140 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
35150 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
35160 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
35170 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
35180 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
35190 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
351a0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
351b0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
351c0 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
351d0 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
351e0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
351f0 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
35200 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
35210 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
35220 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
35230 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
35240 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
35250 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35260 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
35270 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
35280 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
35290 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
352a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
352b0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
352c0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
352d0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
352e0 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
352f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
35310 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
35320 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
35330 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
35340 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
35350 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
35360 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
35370 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35380 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35390 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
353a0 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
353b0 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
353c0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
353d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
353e0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
353f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
35400 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
35410 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
35420 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
35430 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
35440 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
35450 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b  AGER_STAT_MISS]+
35460 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  +;.      rc = re
35470 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
35480 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
35490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
354a0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
354b0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
354c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
354d0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
354e0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
354f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
35500 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
35510 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
35520 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
35530 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
35540 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
35550 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
35560 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
35570 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67  Pager);.  *ppPag
35580 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
35590 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
355a0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
355b0 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65  0./* The page ge
355c0 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65  tter for when me
355d0 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20  mory-mapped I/O 
355e0 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74  is enabled */.st
355f0 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
35600 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70  MMap(.  Pager *p
35610 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
35620 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
35630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35640 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
35650 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
35660 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
35670 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
35680 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
35690 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
356a0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
356b0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
356c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
356d0 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
356e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
356f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
35700 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
35710 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
35720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35730 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
35740 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
35750 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  */..  /* It is a
35760 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
35770 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
35780 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
35790 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
357a0 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
357b0 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
357c0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
357d0 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
357e0 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
357f0 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
35800 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
35810 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
35820 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
35830 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
35840 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
35850 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
35860 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
35870 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61  gno>1.   && (pPa
35880 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35890 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
358a0 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
358b0 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a  READONLY)).  );.
358c0 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46 45  .  assert( USEFE
358d0 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23  TCH(pPager) );.#
358e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
358f0 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28  _CODEC.  assert(
35900 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
35910 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
35920 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  /* Optimization 
35930 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68  note:  Adding th
35940 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d  e "pgno<=1" term
35950 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30   before "pgno==0
35960 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  " here.  ** allo
35970 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ws the compiler 
35980 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75  optimizer to reu
35990 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
359a0 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20  f the "pgno>1". 
359b0 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20   ** test in the 
359c0 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65  previous stateme
359d0 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65  nt, and avoid te
359e0 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e  sting pgno==0 in
359f0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e   the.  ** common
35a00 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f   case where pgno
35a10 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20   is large. */.  
35a20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70  if( pgno<=1 && p
35a30 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
35a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
35a50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
35a60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35a70 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
35a80 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
35a90 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
35aa0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
35ab0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35ac0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
35ad0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
35ae0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
35af0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
35b00 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  ;..  if( bMmapOk
35b10 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
35b20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
35b30 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
35b40 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
35b50 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
35b60 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
35b70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35b80 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
35b90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
35ba0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
35bb0 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46  f( bMmapOk && iF
35bc0 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76  rame==0 ){.    v
35bd0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
35be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35bf0 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
35c00 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36  fd, .        (i6
35c10 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
35c20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
35c30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
35c40 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20   &pData.    );. 
35c50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35c60 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
35c70 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
35c80 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
35c90 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72  READER || pPager
35ca0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
35cb0 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
35cc0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
35cd0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
35ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35cf0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
35d00 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
35d10 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
35d20 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
35d30 26 70 50 67 29 3b 0a 20 20 20 20 20 7d 65 6c 73  &pPg);.     }els
35d40 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
35d50 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
35d60 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
35d70 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61  no-1)*pPager->pa
35d80 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
35d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35da0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20  ( pPg ){.       
35db0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
35dc0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
35dd0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
35de0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
35df0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
35e00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
35e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35e20 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  {.      *ppPage 
35e30 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
35e40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
35e50 20 20 72 65 74 75 72 6e 20 67 65 74 50 61 67 65    return getPage
35e60 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70  Normal(pPager, p
35e70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61  gno, ppPage, fla
35e80 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  gs);.}.#endif /*
35e90 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
35ea0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54  _SIZE>0 */../* T
35eb0 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20 6d  he page getter m
35ec0 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74  ethod for when t
35ed0 68 65 20 70 61 67 65 72 20 69 73 20 61 6e 20 65  he pager is an e
35ee0 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74  rror state */.st
35ef0 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
35f00 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a  Error(.  Pager *
35f10 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
35f20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
35f30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
35f40 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
35f50 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
35f60 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
35f70 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
35f80 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
35f90 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
35fa0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
35fb0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
35fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
35fd0 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
35fe0 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  s */.){.  UNUSED
35ff0 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29  _PARAMETER(pgno)
36000 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
36010 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61  ETER(flags);.  a
36020 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36030 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
36040 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  K );.  *ppPage =
36050 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   0;.  return pPa
36060 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a  ger->errCode;.}.
36070 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c  ../* Dispatch al
36080 6c 20 70 61 67 65 20 66 65 74 63 68 20 72 65 71  l page fetch req
36090 75 65 73 74 73 20 74 6f 20 74 68 65 20 61 70 70  uests to the app
360a0 72 6f 70 72 69 61 74 65 20 67 65 74 74 65 72 20  ropriate getter 
360b0 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73  method..*/.int s
360c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a  qlite3PagerGet(.
360d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
360e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
360f0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
36100 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
36110 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
36120 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36130 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
36140 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
36150 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
36160 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
36170 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
36180 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
36190 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
361a0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
361b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
361c0 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20 70  ->xGet(pPager, p
361d0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61  gno, ppPage, fla
361e0 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  gs);.}../*.** Ac
361f0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
36200 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
36210 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
36220 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
36230 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
36240 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
36250 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
36260 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
36270 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
36280 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a  not in cache. .*
36290 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
362a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
362b0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
362c0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
362d0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
362e0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
362f0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
36300 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
36310 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
36320 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
36330 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
36340 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
36350 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
36360 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
36370 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
36380 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
36390 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
363a0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
363b0 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
363c0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
363d0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
363e0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
363f0 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65    sqlite3_pcache
36400 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  _page *pPage;.  
36410 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
36420 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
36430 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
36440 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
36450 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  che!=0 );.  pPag
36460 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
36470 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
36480 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29  PCache, pgno, 0)
36490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
364a0 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
364b0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
364c0 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  k );.  if( pPage
364d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
364e0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
364f0 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73  PcacheFetchFinis
36500 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
36510 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b  e, pgno, pPage);
36520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
36530 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
36540 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  ce..**.** The sq
36550 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
36560 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
36570 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 29  erUnrefNotNull()
36580 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   may only be.** 
36590 75 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77 20  used if we know 
365a0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 62 65  that the page be
365b0 69 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73 20  ing released is 
365c0 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  not the last pag
365d0 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65 20  e..** The btree 
365e0 6c 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f 6c  layer always hol
365f0 64 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75 6e  ds page1 open un
36600 74 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f 20  til the end, so 
36610 74 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20 74  these first.** t
36620 6f 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20 62  o routines can b
36630 65 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61 73  e used to releas
36640 65 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65 72  e any page other
36650 20 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e 70   than BtShared.p
36660 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  Page1..**.** Use
36670 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
36680 65 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20 72  efPageOne() to r
36690 65 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20 54  elease page1.  T
366a0 68 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74 69  his latter routi
366b0 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 65  ne.** checks the
366c0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
366d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
366e0 65 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e 75  es and if the nu
366f0 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73  mber of.** pages
36700 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69 74   reaches zero it
36710 20 64 72 6f 70 73 20 74 68 65 20 64 61 74 61 62   drops the datab
36720 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  ase lock..*/.voi
36730 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
36740 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67  refNotNull(DbPag
36750 65 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54 4f  e *pPg){.  TESTO
36760 4e 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61 67  NLY( Pager *pPag
36770 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
36780 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20 70 50  ; ).  assert( pP
36790 67 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  g!=0 );.  if( pP
367a0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
367b0 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73 73  _MMAP ){.    ass
367c0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
367d0 31 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20 69  1 );  /* Page1 i
367e0 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d  s never memory m
367f0 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67  apped */.    pag
36800 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
36810 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (pPg);.  }else{.
36820 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
36830 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
36840 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75   }.  /* Do not u
36850 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
36860 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c  to release the l
36870 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ast reference to
36880 20 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73 65   page1 */.  asse
36890 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
368a0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
368b0 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
368c0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  }.void sqlite3Pa
368d0 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
368e0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
368f0 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55   ) sqlite3PagerU
36900 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
36910 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
36920 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e  PagerUnrefPageOn
36930 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
36940 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
36950 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d  .  assert( pPg!=
36960 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
36970 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  Pg->pgno==1 );. 
36980 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
36990 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
369a0 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67 65  P)==0 ); /* Page
369b0 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72  1 is never memor
369c0 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70 50  y mapped */.  pP
369d0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
369e0 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  er;.  sqlite3Pca
369f0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
36a00 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
36a10 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
36a20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
36a30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
36a40 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
36a50 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
36a60 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
36a70 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
36a80 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
36a90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
36aa0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36ab0 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
36ac0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
36ad0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
36ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36af0 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
36b00 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
36b10 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
36b20 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
36b30 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
36b40 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
36b50 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
36b60 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
36b70 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
36b80 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
36b90 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
36ba0 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
36bb0 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
36bc0 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
36bd0 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
36be0 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
36bf0 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
36c00 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
36c10 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
36c20 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
36c30 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
36c40 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
36c50 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
36c60 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
36c70 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
36c80 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
36c90 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
36ca0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
36cb0 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
36cc0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
36cd0 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
36ce0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
36cf0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
36d00 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
36d10 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
36d20 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
36d30 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
36d40 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
36d50 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
36d60 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
36d70 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
36d80 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
36d90 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
36da0 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
36db0 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
36dc0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
36dd0 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
36de0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
36df0 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
36e00 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
36e10 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
36e20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
36e30 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
36e40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
36e50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36e60 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
36e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36e80 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
36e90 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
36ea0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
36eb0 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
36ec0 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
36ed0 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
36ee0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36ef0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36f00 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
36f10 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
36f20 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
36f30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36f40 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36f50 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
36f60 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
36f70 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
36f80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36f90 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
36fa0 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
36fb0 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
36fc0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
36fd0 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
36fe0 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
36ff0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
37000 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
37010 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
37020 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
37030 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
37040 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
37050 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
37060 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
37070 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
37080 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
37090 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
370a0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
370b0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
370c0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
370d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
370e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
370f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
37100 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  T;.    }.  .    
37110 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
37120 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
37130 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
37140 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
37150 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
37160 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
37170 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37180 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
37190 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
371a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
371b0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
371c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
371d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
371e0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
371f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
37200 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
37210 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20  _CREATE;.       
37220 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20   int nSpill;..  
37230 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
37240 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
37250 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
37260 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
37270 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
37280 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
37290 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  RNAL);.         
372a0 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65   nSpill = sqlite
372b0 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  3Config.nStmtSpi
372c0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
372d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  e{.          fla
372e0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
372f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
37300 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
37310 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a   = jrnlBufferSiz
37320 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
37330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a     }.          .
37340 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
37350 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
37360 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68  ase still has th
37370 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69  e same name as i
37380 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20  t did when.     
37390 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69     ** it was ori
373a0 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20  ginally opened. 
373b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
373c0 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
373d0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  d(pPager);.     
373e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
373f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
37410 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20  urnalOpen (.    
37420 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
37430 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
37440 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
37450 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20  lags, nSpill.   
37460 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
37470 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
37480 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
37490 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
374a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
374b0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
374c0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
374d0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
374e0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
374f0 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
37500 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
37510 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
37520 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
37530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
37550 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
37560 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
37570 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
37580 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
37590 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
375a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
375b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
375c0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
375d0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
375e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
375f0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
37600 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
37610 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
37620 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
37630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
37640 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
37650 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
37660 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
37670 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
37680 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
37690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
376a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
376b0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
376c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
376d0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
376e0 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
376f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
37700 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
37710 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
37720 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
37730 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
37740 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
37750 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
37760 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
37770 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
37780 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
37790 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
377a0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
377b0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
377c0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
377d0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
377e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
377f0 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
37800 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
37810 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
37820 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
37830 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
37840 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
37850 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
37860 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
37870 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
37880 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
37890 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
378a0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
378b0 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
378c0 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
378d0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
378e0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
378f0 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
37900 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
37910 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
37920 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
37930 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
37940 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
37950 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
37960 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
37970 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
37980 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
37990 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
379a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
379b0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
379c0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
379d0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
379e0 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
379f0 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
37a00 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
37a10 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
37a20 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
37a30 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
37a40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
37a50 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
37a60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
37a70 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
37a80 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
37a90 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
37aa0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
37ab0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
37ac0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
37ad0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
37ae0 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
37af0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37b00 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
37b10 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
37b20 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
37b30 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
37b40 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
37b50 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
37b60 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
37b70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37b80 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
37b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
37ba0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
37bb0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
37bc0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
37bd0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
37be0 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
37bf0 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
37c00 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
37c10 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
37c20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
37c30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
37c40 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
37c50 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
37c60 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
37c70 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
37c80 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
37c90 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
37ca0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
37cb0 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
37cc0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
37cd0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
37ce0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
37cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
37d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37d10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37d20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
37d30 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
37d40 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
37d50 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
37d60 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
37d70 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
37d80 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
37d90 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
37da0 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
37db0 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
37dc0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
37dd0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
37de0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
37df0 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
37e00 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
37e10 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
37e20 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
37e30 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
37e40 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
37e50 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
37e60 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
37e70 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
37e80 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
37e90 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
37ea0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37eb0 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
37ec0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
37ed0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
37ee0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
37ef0 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
37f00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
37f10 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
37f20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
37f30 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
37f40 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
37f50 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
37f60 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
37f70 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
37f80 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
37f90 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
37fa0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
37fb0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
37fc0 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
37fd0 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
37fe0 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
37ff0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
38000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
38010 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
38020 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
38030 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
38040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
38050 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
38060 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
38070 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
38080 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
38090 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
380a0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
380b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
380c0 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
380d0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
380e0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
380f0 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
38100 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
38110 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
38120 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
38130 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
38140 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
38150 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
38160 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
38170 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
38180 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
38190 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
381a0 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
381b0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
381c0 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
381d0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
381e0 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
381f0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
38200 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
38210 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
38220 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
38230 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
38240 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
38250 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
38260 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
38270 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
38280 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
38290 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
382a0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
382b0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
382c0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
382d0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
382e0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
382f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
38300 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
38310 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
38320 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
38330 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
38340 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
38350 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
38360 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
38370 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
38380 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
38390 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
383a0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
383b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
383c0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
383d0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
383e0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
383f0 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
38400 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
38410 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
38420 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
38430 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
38440 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70  }../*.** Write p
38450 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65  age pPg onto the
38460 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c   end of the roll
38470 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
38480 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
38490 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65  OINLINE int page
384a0 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61  rAddPageToRollba
384b0 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  ckJournal(PgHdr 
384c0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
384d0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
384e0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
384f0 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63    u32 cksum;.  c
38500 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69  har *pData2;.  i
38510 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
38520 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
38530 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
38540 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
38550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
38560 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a  e page that.  **
38570 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
38580 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
38590 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
385a0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a  ert verifies.  *
385b0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
385c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
385d0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
385e0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
385f0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
38600 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
38610 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
38620 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32  lOff );.  CODEC2
38630 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
38640 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
38650 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
38660 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61  _NOMEM_BKPT, pDa
38670 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20  ta2);.  cksum = 
38680 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
38690 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
386a0 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20  ;..  /* Even if 
386b0 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
386c0 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  l error occurs w
386d0 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile jou